Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 10380 | Accepted: 3238 |
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!
Source
#include<stdio.h>
#include<string.h>
int c[20],n,d[50],s;
bool ok;
void dfs(int depth)
{
int p,min;
if(ok) return ;//两个剪枝
if(depth>=n) { ok=true; return; }
min=1<<31-1;
for(int i=1;i<=s;i++)
if( d[i]<min ) { min=d[i]; p=i; }//这个极其重要,保证了每列覆盖的连续性
for(int i=10;i>=1;i--)//数据很小,最大是到10
if(c[i]>0 && min+i-1<=s && p+i-1<=s)//条件
{
bool f=true;
for(int j=p;j<=p+i-1;j++)
if(d[j]>min) { f=false;break;}
if(f)
{
for(int j=p;j<=p+i-1;j++) d[j]+=i;
c[i]--;
dfs(depth+1);
c[i]++;
for(int j=p;j<=p+i-1;j++) d[j]-=i;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
scanf("%d ",&s);
scanf("%d ",&n);
int max=0,sum=0;
bool flag=true;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
if(x+max>s) flag=false;
if(x>max) max=x;
sum+=x*x;
c[x]++;
}
if(sum!=s*s) flag=false;
ok=false;
if(flag) dfs(0);
if(ok) puts("KHOOOOB!");
else puts("HUTUTU!");
}
return 0;
}