PKU 1020
2014-04-20 21:19
211 查看
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<fstream> using namespace std; int l,d[42],c[11],n; bool dfs(int num) { int i,j,minpoint=41,lie; if(num==n) //当个数为所提供的蛋糕的个数的时候,搜索完毕,输出结果 return true; for(i=1;i<=l;i++) { if(d[i]<minpoint) { minpoint=d[i]; lie=i; } } for(i=10;i>0;i--) //从最大的一块蛋糕开始查找,搜索 { if(c[i]&&i+minpoint<=l&&i+lie-1<=l) { for(j=lie;j<lie+i;j++) if(d[j]>minpoint) break; if(j>=lie+i) { c[i]--; for(j=lie;j<lie+i;j++) d[j]+=i; if(dfs(num+1))//dfs return true; for(j=lie;j<=lie+i-1;j++)//回溯,回复原来的状态 d[j]-=i; c[i]++; } } } return false; } int main() { freopen("Cake.txt","r",stdin); int ncase,i,j,k,sum; scanf("%d",&ncase); while(ncase--) { memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); scanf("%d %d",&l,&n); sum=0; for(i=1;i<=n;i++) { scanf("%d",&k); c[k]++; //对等大的蛋糕进行计数,统计个数,从而在dfs()函数中进行判断, //始终从最大的一块蛋糕开始查找,搜索,知道下一个不同大小的蛋糕 sum+=k*k; } if(sum!=l*l) { printf("HUTUTU!\n"); continue; } if(dfs(0)) printf("KHOOOOB!\n"); else printf("HUTUTU!\n"); } return 0; }
相关文章推荐
- 深度优先+回溯(1): pku acm 1020 Anniversary Cake
- pku 1020
- pku1020
- PKU 1020 A Problem about Tree LCA
- PKU 1020
- pku 1020 Anniversary Cake
- [原创]我的PKU ACM POJ 1020解答
- PKU 1650
- 1020:电梯升降
- HDOJ1020 Encoding
- PKU 1509 Glass Beads (最小表示法)
- PKU 3122
- hdu 1020 Encoding(水题)
- PKU 2528 Mayor's posters
- pku 2262
- URAL 1020 Rope(圆与切线)
- [贪心]PKU Stripies
- ural 1020. Rope(几何)
- 1020. 月饼 (25) (数学啊 ZJU_PAT)
- 九度OJ—题目1020:最小长方形