题目:
描述
Nahid Khaleh决定邀请“Shahr-e Ghashang”的孩子参加她的结婚纪念日。她想准备一个已知大小的方形巧克力蛋糕。她要求每个被邀请的人确定他/她想要的那块蛋糕的大小(也应该是方形的)。她知道Kavoosi先生不会浪费任何蛋糕。她想知道她是否可以制作一个这样大小的方形蛋糕,它可以满足所有人的要求,并且没有任何浪费。
输入
输入文件的第一行包含一个整数t(1≤t≤10),测试用例的数量,然后是每个测试用例的输入数据。每个测试用例由一行包含一个整数s,即蛋糕的一侧,后跟一个整数n(1≤n≤16),蛋糕块的数量,后跟n个整数(在1..10范围内) )指定每件的侧面。
输出
每个测试用例应该有一个输出行,其中包含一个单词KHOOOOB!还是HUTUTU!取决于蛋糕是否可以切成特定尺寸的碎片而没有任何浪费。
样例输入
2
4 8 1 1 1 1 1 3 1 1
5 6 3 3 2 1 1 1
样例输出
KHOOOOB!
HUTUTU!
const int MAXN=60; int square[MAXN];//侧面长为i的小蛋糕个数 int col[MAXN];//大蛋糕的每一列被填充的格子数 int n,m; bool dfs(int num){ if(num==n) return false; int minval=m; int minord=0; for(int i=1;i<=m;i++){ if(col[i]<minval){ minval=col[i];//从列号最小的开始填 minord=i;//记下最小的列号 } } int minnum; for(int i=minord;i<=m;i++){ if(col[i]==minval)//填充最小列的行的个数 minnum++; else break; } for(int i=10;i>=1;i--){ if(square[i]<0) continue; if (i <= m - col[minOrd] && i <= minNum) { square[i]--; for (int j = minOrd;j < minOrd + i;j++) col[j] += i; if (DFS(num + 1)) return true; for (int j = minOrd;j < minOrd + i;j++) col[j] -= i; square[i]++; } } return false; } int main() { int t; int wid; scanf("%d", &t); while (t--) { int sum = 0; memset(square, 0, sizeof(square)); memset(col, 0, sizeof(col)); scanf("%d%d", &m, &n); for (int i = 1;i <= n;i++) { cin >> wid; square[wid]++; sum += wid * wid; } if (sum != m * m) { cout << "HUTUTU!" << endl; continue; } if (DFS(0)) cout << "KHOOOOB!" << endl; else cout << "HUTUTU!" << endl; } return 0; }