09 2012 档案
POJ 3744
摘要:题意:人从1开始走,p的概率走1步,1-p的概率走2步,求踩雷的概率。题解:走到第i位置的概率为f[i]=p*f[i-1]+(1-p)*(f[i-2]),利用矩阵快速幂可迅速求出f[i]。考虑成功通过第i个的雷的概率,应该等于没有踩中前(i-1)个雷的概率乘以没有踩中i的概率,而如果没有踩到i-1这颗雷,人必定是从mine[i-1]+1过来的,于是又变成和原来一样的解情况。考虑从1出发顺利通过位于x处的雷的概率,就应该等于一减去踩到x这个位置的概率,而踩到x的概率应该等于f[x],于是,得解。View Code 1 #include<cstdio> 2 #include<cs
阅读全文
POJ 2460
摘要:题意&题解:水,不想说了。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int po[201000][2]; 6 int main() 7 { 8 int n; 9 while(scanf("%d",&n),n)10 {11 int x,y,m;12 m=(n+1)/2;13 for(int i=1;i<=n;i++)14 scanf("%d%d",&a
阅读全文
POJ 2329
摘要:题意:把矩阵n*n中所有的0改成它最接近的正数,若有两个及以上都满足,则不变。题解:bfs每个0View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=50000; 6 int map[300][300],ans[300][300]; 7 int po[N][2]; 8 int stk[N][3]; 9 int dr[][2]={0,1,0,-1,1,0,-1,0};10 bool mark[300]
阅读全文
POJ 2157
摘要:题意:人走迷宫,起点S,终点G,A/B/C/D/E为门,要开A必须集齐地图上所有的a,依次类推,问最后能否到G。题解:从起点出发,dfs所有能到的点,其中,遇到门但没凑够钥匙就将该点标记,代表能到它,遇到钥匙就将还需要凑的钥匙减一。然后每次dfs一遍后,查看所有的被标记了的门,如果钥匙够了就从该点出发再进行一次dfs。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cctype> 5 using namespace std; 6 i
阅读全文
POJ 2748
摘要:题意:给n个圆柱作为底,往上面放圆柱,要求每一层上面的一定比这层的圆柱数少,另外,放的位置不同也要算新的一种,问总共有多少种。题解:通过暴力打表可以看出,要求的g(n)就等于f(2*n-1),其中,f(i)是斐波拉契数列第i项,其次,这题坑爹的有100万组样例,log(n)直接求都会超时。所以,只能先找循环节,随便写个暴力程序求出循环节75000,然后就顺理成章了。View Code 1 #include<cstring> 2 #include<cstdio> 3 #include<set> 4 #include<algorithm> 5 usi
阅读全文
POJ 2926
摘要:题意:求n个五维向量的曼哈顿距离。题解:设点i的坐标为(Xi,Yi,Zi,Wi,Ti),那么它与j的曼哈顿距离为|Xi-Xj|+|Yi-Yj|+|Zi-Zj|+|Wi-Wj|+|Ti-Tj|,去掉绝对值后,可能要取反或者不取,可以看出,若把所有情况全部考虑,答案结果有2^5种,但是由于本来是有绝对值的,可能某个本来是正数的值取了反,某个负数有没有取,但这样肯定只能使原数变小,所以我们要的结果实际上是2^5中最大的那个。 去掉绝对值后,原始变为?(Xi-Xj)+?(Yi-Yj)+?(Zi-Zj)+?(Wi-Wj)+?(Ti-Tj),问号即为需要枚举的那个,但如果这样直接去算,会是2^5*n...
阅读全文
POJ 1848
摘要:题意:给定一棵树,要添加一些边,不能是重边,不能是自环,让它的每一个结点都恰好属于一个环,求最少添加的边数。题解:树形dp:dp[now][0]为以now为根的子树完成题目要求添加的最少边。 dp[now][1]为除开now这个结点后它的子树满足题目要求所需要的最少边。 dp[now][2]为now和它的某一个孩子形成至少长度为2的链所需要添加的最少边,未涉及到的点均已满足题目要求。 转移方程:dp[now][1]=sum(dp[k][0]),k为now的孩子。 dp[now][2]=sum(dp[k][0])-dp[i][0]+min(dp[i]...
阅读全文
POJ 3272
摘要:题意:n个点m条边的有向图,从所有入度为0的点出发到达n,问所有可能路径中,经过的某条路的最大次数是多少。边全是由标号小的到标号大的。题解:正向走一遍,记录到达某点的路径总数,反向走一遍,记录某点出发到终点的总情况数。枚举每条边,求边对应两点所记录的两个信息之积的最大值。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=5005; 6 typedef long long ll; 7 int he
阅读全文
POJ 3279
摘要:题意:黑白的板,每次选择一个十字形翻转(十字板内黑白互换,若是边界则不管),求最小将原图变为全白的策略。题解:枚举第一行翻转情况,2^c,然后验证,由于第一行确定了,后面就可以跟着确定了。View Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int map[20][20]; 6 int hit[20][20],ahit[20][20]; 7 int ans,r,c; 8 const int inf=1<<30;
阅读全文
POJ 2657
摘要:题意:有长度为n的环,环上有m个坏点,目标在z位置,从1出发,每次跳k步,最后到达z,问最小的k是多少。题解:1、暴力枚举,我没试过,但有人这样过了。 2、考虑目标z,假设跳了m圈,最后跳到z,则有(z-1+m*n)≡0 (mod k),如果(z-1)%k==0,直接检验小于z的坏点是否会猜到,否则,m*n≡(z-1)%k (mod k),用模线性方程可以求出m,考虑坏点,分为两类,一类坏点的坐标小于z,人会从上面跨过m+1次,另一类坏点坐标大于z,人会从上面跨过m次。 对于任意一个坏点a,如果在某一次踩在了它上面,就存在(a-1)*(a-1+n)*(a-1+2*n)*(a-1+3...
阅读全文
POJ 1252
摘要:题意:给6种不同面额硬币,求组成[1,100]中数的平均需要硬币与最多需要硬币数,可以通过减法获得,比如有1、4两种硬币,凑成3可以用4-1两个硬币完成,而不是1+1+1三个硬币。题解:背包问题,由于可以减,还需要反过来dp一遍,值得注意的是上界需要设成2000才行。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int dp[2050]; 6 void update(int v) 7 { 8 if(v>0)
阅读全文
POJ 1240
摘要:题意:给定一颗多叉树(<=20)的先序和后序遍历结果,求这种树共有多少。题解:考虑产生相同先序遍历和后序遍历的两种树,S和T,他们每个相同结点对应的孩子数目应该相等,因为假如S某个结点有s个孩子,他们在先序和后序遍历中的顺序是一致的,要想两棵树先序遍历与后序遍历一致,则他们每一个结点的孩子都应该有这种特点。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 typedef long long ll; 6 ll c[
阅读全文
POJ 2887
摘要:题意:在字符串中插入字符,问第i个字符是谁题解:块状链表,不知为什么splay超时= =!View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=1005000; 7 int bs,top; 8 struct Block 9 {10 int size,next;11 char s[3000];12 void push_back(char ch)13
阅读全文
POJ 2227
摘要:题意:一个矩形区域,高低起伏,求最多储水量。(边界不能储水)题解:先将边界装入优先队列中(高度越小越优先),并标记为已访问。看队首元素四周未访问过的点,1、如果该点不比队首低,则将它加入队列,标记为已访问,即它变成了新的边界。2、该点比队首低,意味着该点可以储水,更新ans值,同时将它加入队列中,但是它的高度为原队首元素的高度,即以它为边界的点不能超过这个高度,同时将该点标记为已访问。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<que
阅读全文
POJ 1509
摘要:题意:将字符串第i位开始的字串提到前面形成A[i],求n个这种串中字典序最小的串的i。题解:1、暴力可以水过。。 2、最小表示法,具体参见IOI2003论文《最小表示法在字符串循环同构问题中的应用》。View Code 1 #include<cstdio> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int T; 8 for(scanf("%d",&T),getchar();T;T--) 9 {10 char
阅读全文
POJ 3257
摘要:题意:牛要建立长为n的云霄飞车,可以有m个事件点,每个事件设计4个变量,即从a点开始,长为b,给牛f的开心值,要花费c元。牛总共有b元,它们想从0开始,一直经历事件点到最后,使得开心值最大,求此值。题解:对每个事件点建立一条边,同时用dp[i][j]代表第i个点话费了j的钱所能得到的最大开心值,然后用类似dijiskra的算法,从0到n-1开始松弛,再从dp[n][..]中选一个最大的即可。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namesp
阅读全文
POJ 2955
摘要:题意:给一个括号串,求最大匹配。题解:记忆化搜索,dp[i][j]为[i,j]的最大匹配,dp[i][j]=max(dp[i+1][j-1]+corr(s[i],s[j]),dp[i][k]+dp[k+1][j]);View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int dp[105][105]; 6 char s[105]; 7 int corr(char a,char b) 8 { 9 if((a=='(
阅读全文
POJ 1686
摘要:题意:给出两个含未知数的表达式,判断其是否相等。题解:任意给未知数赋值,看起结果是否相同。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cctype> 5 using namespace std; 6 const int N=1000; 7 char op[8]= {'+','-','*','/','(',')','\0'
阅读全文
POJ 3322
摘要:题意:在r*c的矩形方格地图中,有钢地板和易碎地板,分别以'.'和'E'代替。有个1*1*2的长方体,在这上面滚动,要使它最后立在目标位置上(就是只占一格且在目标上),长方体初始位置用'X'表示,目标用'O'表示。题解:bfs,记录长方体左上角的点的位置以及它的摆放位置(立着:0,横躺着:1,竖躺着:2),然后就可以用mark[505][505][3]的bool数组记录是否走过某点了。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<
阅读全文
POJ 2812
摘要:题意:给一个多边形柱体的底边形状和体积,求它的高。题解:叉积求面积,再用体积除以面积。View Code 1 #include<cstdlib> 2 #include<cmath> 3 #include<cstdio> 4 #include<algorithm> 5 #define max(a,b) (((a)>(b))?(a):(b)) 6 #define min(a,b) (((a)>(b))?(b):(a)) 7 #define sign(x) ((x)>eps?1:((x)<-eps?(-1):(0))) //符号
阅读全文
POJ 1390
摘要:题意:给定n个不同颜色的盒子,连续的相同颜色的k个盒子可以拿走,权值为k*k,求把所有盒子拿完的最大权值。题解:记忆化搜索,dp[ll][rr][kk]代表在区间[ll,rr]取盒子,其中ll前面有k个盒子颜色和rr一样,可以重叠在rr上消去。 那么,dp[ll][rr][kk]=max(dp[ll][i][kk+len[rr]]+dp[i+1,rr-1][0],dp[ll][rr-1][0]+pow(len[rr]+kk)),i是所有位于[ll,rr-1]区间且与rr颜色相同的盒子;View Code 1 #include<cstdio> 2 #include<cstrin
阅读全文
POJ 1155
摘要:题意:给定一棵树,树的边带负权,树的叶子带正权,求一棵子树,要求涵盖尽可能多的叶子,同时保证总权值不为负题解:树形DP,dp[i][j]代表以i为根的子树含有j个叶子结点时最大权值,对每一个i的子树,dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[t][k]-c)View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 using namespace std; 6 const int N=3005,i
阅读全文
POJ 1475
摘要:题意:推箱子,要求箱子移动步骤最小。题解:双重bfs,先对箱子bfs,然后判断这种bfs是否可达(对人bfs)。题解本来很简单,但是这题数据SPJ方式各种坑,已经说不上坑了,就是错的。网上各种AC代码也是过不了一些数据,例如:5 5.......###....T#B####S###遍历的时候还要限制顺序才能A,好TM无语。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<string> 5 #include<cctype>
阅读全文
POJ 2556
摘要:题意:一个点从(300,420)走到(310,420),方向向右,然后遇到A向右转90度再直走10,反之,向左转90度再直走10.题解:同上View Code 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int dr[][2]={10,0,0,-10,-10,0,0,10}; 5 int main() 6 { 7 char s[250]; 8 while(gets(s)) 9 {10 int x=310,y=420,d=0;11 printf("300 ...
阅读全文
POJ 3705
摘要:题意:通过复制粘贴将正序序列变成逆序序列,要求步骤最少。题解:分奇偶讨论,若是奇数,则反复的将最大的那数前面的偶数个数的中间两个挪到后面相应位置,如n=71 2 3 4 5 6 71 2 5 6 7 3 41 6 7 3 2 5 47 3 2 1 6 5 4这样做可以使得每次移动都形成两个降序序列。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 int n; 8 while(scan
阅读全文
POJ 3225
摘要:题意:定义对集合的交、并、差、异或,求空集经过一系列操作后的结果。题解:将原点集每一个点乘以2,形成一个新的点集,其中偶数点都对应着原来的点,奇数点对应着不包括它左右两个点的开区间,即2k+1==>(k,k+1),于是区间上所有点都能用整点表示,线段树可求解,对于每一个操作区间,无论开闭,都对应这线段树上的一段线段。1、并运算[a,b],就是将[a,b]赋值为1.(a,b均为对应之后的点)2、交运算[a,b],将除了[a,b]区间以外的线段清0.3、S-[a,b],将[a,b]区间清0.4、[a,b]-S,将[a,b]区间以外线段清0,并且将[a,b]线段所代表区域取反.5、异或运算,上
阅读全文
POJ 2555
摘要:题意:t2摄氏度的冰m2克,扔进t1摄氏度的m1克水中,不考虑外界条件,求最终状态。题解:临界点为0摄氏度,分四种情况讨论,即等于0摄氏度两种,其余两种。先求出将水完全结成冰需要放出的热量和将冰化成水需要吸收的热量,两两比较,判断化冰还是结冰。然后看将水或冰变成0摄氏度的所贡献的热量是否足以使另一个变成自己,如果是,直接热量相减把两者都当成0摄氏度的某样东西加温或者降温即可,否则,也是相减然后看这温度能使多少冰化成水或者水结成冰。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorith
阅读全文
POJ 3138
摘要:题意:算ACM出线名额,3种情况得名额:1、学校有队伍解题大于等于m。2、世界总决赛前20名学校。3、举办过比赛的学校。题解:后两个条件题目直接给,然后注意第一个条件只能算一次就OK了。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int tot[105]; 6 bool mark[105]; 7 int main() 8 { 9 int n,m,num,ca=0;10 while(scanf("%d%d
阅读全文
POJ 1408
摘要:题意:给一个1*1的正方形,然后每条边上有n个点,按照一定规律连线把矩形切成(n+1)^2个小四边形(方式不好描述,直接看题吧),求这里面面积最大的小四边形。题解:求四边形面积可以直接用叉积公式,然后用两个扫描线,记录相邻的两条线上组成四边形的所有的点,计算之后,靠右的扫描线变成新的扫描线组的左边的线。View Code 1 #include<cstdlib> 2 #include<cmath> 3 #include<cstdio> 4 #include<algorithm> 5 #define max(a,b) (((a)>(b))?(a
阅读全文
POJ 3505
摘要:题意:一个类似于硬磁盘的停车场,要从哪取车就让磁头转到哪然后让盘面旋转使得要取的车到磁头处,然后读取到信息回到出口处。。。然后给你取车顺序,问总花费时间。题解:模拟吧。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int pos[55]; 6 struct data 7 { 8 int h,p; 9 }po[55*55];10 int main()11 {12 int T;13 for(scanf("%d
阅读全文
POJ 1734
摘要:题意:给定一个无向图,有重边,求最小代价环,环上点数必须大于2题解:类似floyd,在进行最小距离的同时,枚举点k的两端是否形成回路,如果形成,必定是没有经过重复点的,因为那样就不是最小距离,而经过点k的弧的松弛操作还没进行,所以也不会经过kView Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int inf=1<<29; 6 int dist[105][105],map[105][105],pre
阅读全文
POJ 1365
摘要:题意:给出某数的质因数分解结果,求它减一后分解的质因数结果。题解:模拟。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int mr=40000; 6 bool notp[mr]; 7 int pr[mr]; 8 int pn; 9 void getpri()//筛素数10 {11 pn=0;12 memset(notp,0,sizeof(notp));13 for(int i=2; i<mr; i
阅读全文
POJ 1486
摘要:题意:给定n张幻灯片,每张都有数字,由于幻灯片是透明的,所以不能确定每个数字指的是哪个,于是问你能确定哪些。题解:二分匹配,然后再对每一个点检验,即找到它当前未匹配的对象且能够与它进行匹配的,将他们进行匹配,然后找因此而失配的那个点的增广路,能找到就说明不能确定。View Code 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int link[30],rlink[30],n; 5 bool g[30][30],chk[30]; 6 bool findpath(int x) 7 { 8 .
阅读全文
POJ 1192
摘要:题意:题目叙述很长,但很简单,其实如果是英文题倒还可以狠狠的恶心一下人的= =!就是给一个无向树,求最大权子树题解:树形dp,dp[i][0]代表不要第i个点时以i为根的子树的最大价值,dp[i][1]代表必须要i时以i为根的子树的最大值。于是dp[i][0]=max(dp[i][0],dp[j][0],dp[j][1]),j为i能到的点,dp[i][1]=val+sum(max(dp[j][1],0)),即取所有权值为正的i的子树与它相连,注意必须是dp[i][1],因为要保证树最后的连通性。View Code 1 #include<cstdio> 2 #include<c
阅读全文
POJ 1675
摘要:题意:给一个蛋糕,然后三个草莓,要求将蛋糕均分为三份(120度的扇形),不切割草莓并且保证每份蛋糕均有一个草莓,是否可行。题解:三种情况不可行:1、草莓在蛋糕圆心(被这坑了)。 2、存在两草莓与圆心三点共线。 3、三个草莓张角小于120度。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const double PI=acos(-1.0),eps=1e-8; 7 inl
阅读全文
POJ 3071
摘要:题意:2^n支球队按照竞赛图踢足球,给你任意两支球队相互之间踢赢的概率,求最后那支球队最可能夺冠。题解:dp[j][i]代表第j支球队通过第i场比赛的概率,然后dp[j][i]=sum(dp[j][i-1]*dp[j+k][i-1]*p[j][j+k]),k是它这一场可能面对的对手,实际上就是它上一场比赛的第一支队伍+2^(i-1)一直到+2^i。View Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 double p[(1
阅读全文
POJ 3716
摘要:题意:给4个骰子,每面染有红色或者蓝色,概率相等,然后告诉你前两次扔后红色面朝上的骰子各有几个,问你再扔一次红色面朝上概率是多大题解:对于推不出公式的童鞋就只好爆搜了,但是,条件概率公式还是要知道才行,即P(A|B)=P(B|A)*P(A)/P(B),通过这个,单独看每一个骰子,可以求出当掷出骰子状态为00,01,10,11时骰子6面为t时的概率。 接着,就是4^4枚举每个骰子状态*7^4枚举每个骰子染色状况*2^4计算期望,然后,还100MS+给过了View Code 1 #include<cstdio> 2 #include<cstring> 3 #include&
阅读全文
POJ 2526
摘要:题意:给出n个点,判断是否有中心对称点。题解:排序,验证View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 struct point 6 { 7 int x,y; 8 bool operator<(const point &ne)const 9 {10 if(x!=ne.x)11 return x<ne.x;12 else13 return y<ne....
阅读全文
POJ 2139
摘要:题意:给定牛的关系图,求其中一头牛与其他牛关系路程之和最小,然后输出这数乘以一百在除以n-1,虽然貌似题目没说,但是是向下取整= =!题解:flyod最短路,枚举找最小View Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int d[400][400]; 6 int main() 7 { 8 int n,m; 9 while(scanf("%d%d",&n,&m)!=EOF)10 {11
阅读全文
POJ 3275
摘要:题意:将n头牛产奶速度又快到慢排序,已经比较了m对牛,问还至少需要多少次比较。题解:n头牛如果排序完成,应该有C(n,2)关系已知,即任意两头牛的速度都知道了。然后可以从已经比较了的m对牛中算出可以推导出多少对牛已经知道了,推导方法可以参考floyd最短路,然后用C(n,2)减去它就是答案。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int head[2][1005],nc[2]; 6 struct Edge 7
阅读全文
POJ 3050
摘要:题意:问从5*5的矩阵中选连续的6个组成的字符串有多少种题解:dfsView Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<set> 5 using namespace std; 6 int map[6][6]; 7 set<int> ss; 8 void dfs(int x,int y,int res,int k) 9 {10 if(k==6)11 {12 ss.insert(res);13 return;14 }15 ...
阅读全文
POJ 3226
摘要:题意:给定长度,然后从26个字母中选择n个来组成一个长为n的字符串,按照字典序标号为0,1,2.......,然后题目会给你字符串,求这个字符串的标号题解:从m个字母中选择k个组成序列的放法数位P(m,k),从左往右依次填充,进行到第i个字母时,字典序小于该字母的元素还有cnt个,则说明它前面还有cnt个P(m,k),然后扫一遍出答案,由于n<=26,所以要高精度。View Code 1 import java.util.*; 2 import java.math.*; 3 class Main 4 { 5 public static void main(String arg[]) ..
阅读全文
POJ 2626
摘要:题意:每个人都可以派去下黑棋或者下白棋,但不能都下,然后每人都有各自擅长度,最后选出30人,15人下黑棋,15人下白棋,使得下白棋的擅长度加上下黑棋的擅长度之和最大。题解:dp[i][j]代表i个人下黑棋,j个人下白棋的最大价值,转移方程即为max(dp[i][j],dp[i-1][j]+a,dp[i][j-1]+b),需要注意这是0,1背包,所以要从大往小dpView Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int
阅读全文
POJ 1254
摘要:题意:给两个点的x,y坐标以及当前点与他们的角度,求当前点的位置。题解:每一个点的坐标与角度可以构成一条直线,然后求两直线交点。View Code 1 #include<cstdlib> 2 #include<cmath> 3 #include<cstdio> 4 #include<algorithm> 5 #define max(a,b) (((a)>(b))?(a):(b)) 6 #define min(a,b) (((a)>(b))?(b):(a)) 7 #define sign(x) ((x)>eps?1:((x)<
阅读全文
POJ 3680
摘要:题意:给定n个带权开区间,选择其中一些使得权值最大并且区间重叠层数不超过k。题解:最小费用流,区间有两百个,可以用左边的点发出一条到右边的点的边,容量为1,费用为负的权值。然后从左往右将依次将相邻的两个点都连起来,权值为0,容量为k,也就是说,如果选了这个区间,就会从费用为负数的边流过去,否则,就是从这个费用为0的边流过去。然后建立一个虚拟源点与最左边的点相连,权值为0,容量为k,这样就保证了重叠数之多为k,因为增广路上所经过的区间必定是不重合的,而流量只有k,所以满足题意。View Code 1 #include<cstdio> 2 #include<cstring>
阅读全文
POJ 1563
摘要:题意:蜗牛掉进高位H的井里,向外爬,初始高度为0,白天爬U*G,G为体力值(>=0),晚上掉下来D,初始体力值为100%,以后每爬一天减小P,其中,告诉H,U,D,P,求最后多少天爬出去或者再次掉下去。题解:这题坑爹之处在于让人产生它很高端的误解,题目叙述说连续的爬行会减体力值,开始我还误以为休息一天又恢复了,然后可以安排什么时候休息使得爬出去时间最少= =!后来有以为蜗牛体力变成0后那天不爬,下一天又满状态复活了,于是WA就出现了。不过,题目貌似也没说体力将为0后蜗牛就放弃了啊~~~View Code 1 #include<cstdio> 2 #include<cst
阅读全文
POJ 1976
摘要:题意:一维序列,用三个相等长度区间区覆盖,使得覆盖的权值最大题解:dp[i][j]为前i个数用j个区间覆盖的最大值,状态转移分为覆盖第i个数和不覆盖第i个数两种。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int dp[50005][4],sum[50005]; 6 int main() 7 { 8 int T; 9 for(scanf("%d",&T);T;T--)10 {11 in
阅读全文
POJ 1815
摘要:求字典序最小的最小割,首先,对于每一个不是源点和汇点,拆成两个点,有一条容量为一的边。求一次最小割后,针对每一个结点,按照字典序枚举若是删了它与它映射过去的另一个点之间的边是否会使得最小割变小,是则必须删它,否则,不用。本来应该dfs求出S,T集合的来降低复杂度的(判断删去一条边是否会使得最小割变小),但是这道题点数边数都很小,直接暴力就行了。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=5
阅读全文
POJ 2668
摘要:将原来所有的的i按照d/i上取整=k的划分为各个区间[next,now),这区间里的ans值就等于(now-next)*k初始now=n+1,k=1,然后每次next就等于d/i,k依次递增,实际上,不是每一个k的next和now所指代的区间都有意义,即next<now,所以,每当遇到一个这种没有意义的next和now时,就通过d/(now-1)上取整找到新的k,这样就可以大大节省时间。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<alg
阅读全文
POJ 2442
摘要:直接用优先队列bfs+set判重水过,需要注意的是,因为m<=100,所以用short就可以不超内存了= =!View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 #include<set> 6 using namespace std; 7 int ar[105][2005],n,m; 8 struct data 9 {10 short p[105];11 int sum;12 bool operato
阅读全文
HDOJ 4276
摘要:先将1到n的路径上的点进行缩点,总时间减去该路径长度,然后这道题就和ZOJ 3626一模一样了,也就是,树形DP。。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int head[200],nc,dp[200][600],v[200]; 6 struct edge 7 { 8 int to,cost,next; 9 }edge[1000]; 10 struct data 11 { 12 int a,b,c; 13
阅读全文
HDOJ 4267
摘要:让人一看就知道是线段树的题,不过具体操作起来就比较DT了。我的做法是每个结点保存以这个区间开头的每隔多少个数加上一个数,说白了,就是题目说的第一种操作的k,c,k<=10,所以一个s[11]数组可以解决。然后每个1 a b k c 操作,就是对区间[a,b]的s[k]加上一个c,若是线段树中存在[a,b]直接加上即可,否则,左孩子仍然照加,右孩子就需要找第一个属于[a,b]区间且i-a%k==0的数,变成给[i,b]的s[k]加上c计算某个点的值时,需要把涵盖这个点的所有线段上的s数组对它的影响算进去,即看pos-left mod i是否等于0。View Code 1 #include&
阅读全文
POJ 2688
摘要:找一条哈密顿路,爆搜完事#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;int path[20][20];bool mark[30][30];int map[30][30];char ss[30][30];struct data{ int x,y,step; data(){}; data(int _x,int _y,int _step){x=_x;y=_y;step=_step;}};data po[15];int dr[
阅读全文
POJ 2573
摘要:还有一道比这道题更简单但是一样的题,忘了题号了,那题只求最少时间,实际上两题差不多,贪心策略1、让划船划的最快的人依次与最慢的两人组队去对面,然后他在把船划回来,这样到对岸的时间花费很多,但是回来的时间少。2、先让最快的两人去对岸,然后让其中一人把船划回来,再让最慢的两人组队去对岸,让先前还剩下那人把船划回来,这样使得到对岸的时间减少了,但是划回来的时间增多了。依靠上面两个贪心策略,执行一次后得到的状态都是相等的,于是可以递归解决,每次进行比较,看哪种贪心策略更优,直到要过河的人小于4#include<cstdio>#include<cstring>#include&l
阅读全文
POJ 2565
摘要:模拟,照着说的做就行了。#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const double eps=1e-8;struct data{ int h,m,s; double tot,speed; data(int _h,int _m,int _s) { h=_h;m=_m;s=_s; tot=_h*60+_m+_s/60.0; speed=0; } data(){} void print() { ...
阅读全文
POJ 1690
摘要:好坑爹的一道字符串类型的模拟题,看来我就不适合做这种题,无论怎样简单,总会错几次才能对。#include<cstdio>#include<cstring>using namespace std;int main(){ int T; for(scanf("%d ",&T); T; T--) { char s[1000]; char ans[1000]; int st[1000]; gets(s); int len,i,j,num=0; for(i=j=0; s[i]; i++) {...
阅读全文
POJ 1270
摘要:dfs输出原图所有拓扑序就行了。#include<cstdio>#include<cstring>#include<cctype>using namespace std;int d[30],head[30],nc,n;struct edge{ int to,next;}edge[200];void add(int a,int b){ edge[nc].to=b;edge[nc].next=head[a];head[a]=nc++;}char ans[30];void dfs(int k){ if(k==n) { puts(ans); retu...
阅读全文
POJ 1695
摘要:直接DP,做完看别人说是用类似于双调欧几里得旅行商问题一样的方法解,仔细一看我的代码,貌似也和那旅行商问题做法差不多~~这题坑爹之处在于,不能用floyd去优化,也就是说说好了从a到c是99,然后你不能靠先到b再到c来优化。。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 int cos[50][50],dp[2][33][33][33]; 6 struct data 7 { 8 int x,y,z; 9 data() {}
阅读全文
POJ 2584
摘要:裸的最大流View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=2000,M=10000; 6 const int inff=1<<29; 7 int head[N],nc; 8 struct edge 9 { 10 int x,y,next; 11 int cap; 12 } edge[M*3]; 13 void add(int x,int y,int cap) 14 { 15 edg
阅读全文
POJ 2225
摘要:三维最短路View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 struct data 7 { 8 int x,y,z; 9 bool operator==(const data &ne)const10 {11 return x==ne.x&&y==ne.y&&z==ne.z;12 }13 data(){}14 data(int _x,
阅读全文
POJ 3044
摘要:姑且算作贪心吧,从左往右遍历,对于每一个从点,如果它的那个高度没有被其他木板占据,就让它尽可能向右延伸,最后看有多少次这种伸展操作。可以利用像并查集一样的结构来储存每个点最多能延伸到多远。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int to[50005],a[50005],y[500005]; 6 int main() 7 { 8 int n,w; 9 while(scanf("%d%d"
阅读全文
POJ 2437
摘要:贪心策略,从左往右,在保证最左边那点能覆盖同时尽可能往右覆盖,貌似很多题都可以这样贪。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 struct data 6 { 7 int s,e; 8 bool operator<(const data &ne)const 9 {10 if(s!=ne.s)11 return s<ne.s;12 else13 ...
阅读全文
POJ 3450
摘要:二分长度,枚举字串,KMP判断。View Code 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 char s[4005][205]; 6 char ans[205]; 7 int next[205],n; 8 void getnext(char sr[]) 9 {10 int i,j;11 i=0;j=-1;next[0]=-1;12 for(;sr[i]!='\0';)13 {14 if(j==-1||sr[i]=
阅读全文
POJ 2110
摘要:O(n^3log(n))47MS水过,枚举高度差log(n),枚举最低高度n,dfs一遍n^2View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 bool mark[105][105]; 6 int map[105][105]; 7 int n; 8 bool dfs(int x,int y,int mmin,int len) 9 {10 mark[x][y]=true;11 if(x==n&&y==n)
阅读全文
POJ 2960
摘要:利用SG函数特性,和的SG函数等于单独SG函数的异或,然后对预处理SG函数View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int sg[10005]; 6 bool mark[10005][105]; 7 int s[105]; 8 int main() 9 {10 int m;11 while(scanf("%d",&m)&&m)12 {13 memset(mark,fa
阅读全文
POJ 3436
摘要:虽然一次秒过六级,但还是觉得这种冗长的题目非常蛋疼~3进制位压缩以进行判断是否有边,接着就是一次最大流,判断最后经过了哪些边只用考虑拆点后右边的点发出去的通往左边的点的那些边里初始流量减去现在流量是否等于0即可。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=200,M=20000; 6 const int inff=10000000; 7 int head[N],nc; 8 struct e
阅读全文
POJ 3498
摘要:拆点+最大流,对与拆开的点建立容量为最多跳几次的边,在建立源点到每个点的边,容量为那有多少只企鹅,最后让互相能到的点建立边。View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=800,M=100000; 6 const int inff=1<<29; 7 const double eps=1e-8; 8 int head[N],nc; 9 struct edge 10 { 11 int
阅读全文
POJ 2570
摘要:可以看成floyd,用bool变量标记公司View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<set> 4 using namespace std; 5 bool ss[300][300][30]; 6 void floyd(int n) 7 { 8 for(int k=1;k<=n;k++) 9 {10 for(int i=1;i<=n;i++)11 {12 if(ss[i][k][26])13 {14 ...
阅读全文
POJ 3432
摘要:给一些点找正方形,其实就是枚举每两个点所形成的线段看它是否能和其它点组成正方形,将所有的点存在hash表里,然后枚举两个点,算出它能生成的正方形的另外两点的坐标,如果都在hash表里,则说明这两点连线能够生成一个正方形。另外,在考察每一个正方形,共有四条边,也就是说它在运算过程中被算了四次,最后ans再除以4便是答案。View Code 1 import java.util.*; 2 import java.math.*; 3 class Main 4 { 5 static int x[]=new int[2500]; 6 static int y[]=new int[250...
阅读全文
POJ 2976
摘要:算是一道裸的0-1分数规划,0-1规划正确性的证明请参考OI论文《最小割模型在信息学竞赛中的应用》,里面非常详细。总之,就是枚举比例,求a-bx的最大值,由于最多可以删去k个物品,实际就是保留n-k个,然后就在n个物品中选出最大的n-k个物品,然后再看剩下的物品里面权值为正就加进来,最后,看ans是否等于0View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 double a[1005],b[1005]; 6 const
阅读全文
POJ 1248
摘要:有很多这样的题,给一个这样的集合,让你去找几个数使他们加起来满足什么条件,一般要找4~6个数什么的,直接做就会超时,可以折半找2~3个数并将它们结果存起来,再另找2~3个数去验证。这样讲n^4~n^6就变成了n^2~n^3(用hash的话)View Code 1 import java.util.*; 2 import java.math.*; 3 class Main 4 { 5 static int pow(int a,int n) 6 { 7 int ans=1; 8 while(n>0) 9 {10 ...
阅读全文
|
|
|