Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 11377 | Accepted: 3574 |
Description
Input
Output
Sample Input
2 4 8 1 1 1 1 1 3 1 1 5 6 3 3 2 1 1 1
Sample Output
KHOOOOB! HUTUTU!
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int pos[50],cake[15];//pos[i]第i列已经用了pos[i]行,cake[i]边长为i的有cake[i]个
int n,m;//盘子边长,个数
bool dfs(int id)
{
if(id==m) return true;
//找出用的最少的那一列
int minc=100,c=-1;
for(int i=1;i<=n;i++)
{
if(pos[i]<minc) minc=pos[i],c=i;
}
//枚举小矩形蛋糕的边长
for(int i=10;i>=1;i--)
{
if(cake[i]&&minc+i<=n&&c+i-1<=n)
{
int flag=1;
for(int j=c;j<=c+i-1;j++)
{
if(pos[j]>minc)
{
flag=0;break;
}
}
if(!flag) continue;
cake[i]--;
for(int j=c;j<=c+i-1;j++) pos[j]+=i;
if(dfs(id+1)) return true;
cake[i]++;
for(int j=c;j<=c+i-1;j++) pos[j]-=i;
}
}
return false;
}
int main()
{
int ci;scanf("%d",&ci);
while(ci--)
{
memset(cake,0,sizeof(cake));
memset(pos,0,sizeof(pos));
scanf("%d%d",&n,&m);
int sum=0;
for(int i=0;i<m;i++)
{
int x;scanf("%d",&x);
sum+=x*x;cake[x]++;
}
if(sum!=n*n) {printf("HUTUTU!/n");continue;}
if(dfs(0)) printf("KHOOOOB!/n");
else printf("HUTUTU!/n");
}
return 0;
}