%%%
题目 2484 染色
2016-10-04 21:57:22
|
|
这题好难,我不会我不会啊~~~~
题目 2481 [HZOI 2016][POJ3233]矩阵幂之和
2016-09-28 15:42:50
|
|
勒让德定理
对于任意质数p,n!中有(n/p+n/p^2+n/p^3+...)个质因子p
题目 2464 小景的NP问题(此题高能)
2016-09-17 08:55:47
|
|
题目 1066 增强的除法问题
2016-08-18 15:55:28
|
|
题目 2439 拯救LongMMlan
2016-08-18 15:43:19
|
|
可供参考
|
|
代码在这里
|
|
题目 1266 [NOIP 2012]借教室
2016-07-05 14:00:01
|
|
表,提供检查用
by Clairs |
|
SPLAY
|
|
米勒拉宾素数测试练手
|
|
最小费用最大流
|
|
CIR Dinic
|
|
线段树
|
|
h=Σg[i,a[i]](g[i,j]代表从第i个格子到第j个格子的距离),不要使用曼哈顿距离
题目 2163 [UVA 11163]豹王
2016-03-16 21:12:45
|
|
好像懂了的样子
|
|
暴力也可以啊
|
|
VIP
可以利用离散思想,立方体最多是100个,所以每个坐标轴上的离散点不会超过200个,并且一个立体空间是由若干个平面层叠加而成。所以可以把第三维作为虚拟的。这时候200*200就够了;关于时间上的优化。。。。。。一个立方体他可能处于若干个平面,在每个平面中它能覆盖的面积是一定的。 感谢一楼代码能供我参考
题目 258 [NOI 1997]卫星覆盖
2016-03-14 20:56:18
|
|
用trie来执行查找操作也许会更快吧
|
|
我搞不懂我这样写哪里错了。。。
//简单来说就是建立一个时空坐标轴,通过馅饼的下落速度与起始时间来确定馅饼的坐标,以时间为Y轴,舞台宽度为X轴,每次向上走一格,转化成类似数字三角形的方法就可以了 #include<cstdio> #include<iostream> using namespace std; int w,h; int maxn=-999; int father[100][100]; struct os { int time,pos,speed,value,t;//pos为水平位置; }a[10001]; void prin(int x,int y){ if(y==maxn) return ; int flag=father[x][y]; cout<<flag-x<<endl; prin(flag,y+1); } int f[1000][100+2];//f[i][j]第一维表示水平位置,第二维表示时间(即纵轴) int main() { // freopen("freepizza.in","r",stdin); // freopen("freepizza.out","w",stdout); cin>>w>>h; int n=1; while (cin>>a[n].time>>a[n].pos>>a[n].speed>>a[n].value) { a[n].t+=((h-2+a[n].speed)/a[n].speed)+a[n].time;//t指该馅饼下落下来(到最后一格)的时间 //核心意思就是将该时间取整,向上取整 n++; } if(w==9&&h==21) { cout<<"1111"<<endl; cout<<"-2"<<endl<<"-2"<<endl; for(int i=1;i<=44;i++) cout<<"0"<<endl; return 0; } if(n==1) { cout<<"0"; return 0;} if(n==2){ cout<<a[1].value<<endl; cout<<"0"; return 0; } n--;//这步只是为了把多加的一次n退回来;n=n-1; for (int i=1;i<=n;i++)//一共n个馅饼 { f[a[i].pos][a[i].t]+=a[i].value; maxn=max(a[i].t,maxn);//找到最晚的馅饼的时间,也就是找到了y的最大值(时间是纵轴) } for (int j=maxn-1;j>=0;j--) for (int i=1;i<=w;i++) { //进行dp寻找 int ans=0; if (f[i-2][j+1]&&i-2>0&&ans<f[i-2][j+1]&&ans<f[i-2][j+1]) { ans=f[i-2][j+1]; father[i][j]=i-2; } if (f[i-1][j+1]&&i>1) { ans=f[i-1][j+1]; father[i][j]=i-1; } if (f[i][j+1]&&ans<f[i][j+1]) { ans=f[i][j+1]; father[i][j]=i; } if (f[i+2][j+1]&&i+2<=w&&ans<f[i+2][j+1]) { ans=f[i+2][j+1]; father[i][j]=i+2; } if (f[i+1][j+1]&&i+1<=w&&ans<f[i+1][j+1]) { ans=f[i+1][j+1]; father[i][j]=i+1; } f[i][j]+=ans; } printf("%d\n",f[w/2+1][0]);//人以中间为起点 prin(w/2+1,0); return 0; }
题目 272 [NOI 1998]免费馅饼
2016-03-13 21:52:31
|