/*276k 32ms*/
#include <iostream>
//#include <fstream>
using namespace std;
#define SIZE 11
#define COL 50
//var
//fstream fin;
int a[SIZE];
int b[COL]; //ÿһÁи߶È
int s,n;
//function
bool dfs(int t);
int main()
{
//fin.open("1020.txt",ios::in);
int t;
cin>>t;
while(t--)
{
cin>>s>>n;
memset(a,0,SIZE*sizeof(int));
int i;
int sum=0;
int value;
for(i=0;i<n;i++)
{
cin>>value;
sum+=(value*value);
a[value]++;
}
for(i=0;i<s;i++)
b[i]=0;
if((s*s)==sum&&dfs(0))
cout<<"KHOOOOB!"<<endl;
else
cout<<"HUTUTU!"<<endl;
}
system("pause");
return 0;
}
bool dfs(int t)
{
if(t==n)
return true;
int i;
int min=100;
int index=-1;
//ÕÒµ½µ±Ç°¸ß¶È×îСµÄÁÐ
for(i=0;i<s;i++)
if(min>b[i])
{
min=b[i];
index=i;
}
//cout<<index<<":";
for(i=10;i>=1;i--)
{
if(!a[i])
continue;
//index ´ú±íµÄÊǵ±Ç°×îСÁеÄindex
if(index+i>s||b[index]+i>s)
continue;
//¼ÆË㵱ǰµÄ·½¿éÊDz»ÊÇ¿ÉÒÔÌî³ä
int j;
bool f=true;
for(j=index;j<i+index;j++)
{
if(b[j]>b[index])
{
f=false;
break;
}
}
//µ±Ç°µÄ·½¿é¿ÉÒÔÌî³ä³É¹¦
if(f)
{
int k;
for(k=index;k<i+index;k++)
b[k]+=i;
a[i]--;
if(dfs(t+1))
return true;
a[i]++;
for(k=index;k<i+index;k++)
b[k]-=i;
}
}
return false;
}
原来的代码:(TLE)
#include <iostream>
#include <algorithm>
//#include <fstream>
using namespace std;
#define SIZE 20
#define COL 50
//var
//fstream fin;
int a[SIZE];
int b[COL]; //ÿһÁи߶È
int c[SIZE];
int s,n;
//function
bool dfs(int t);
int cmp(const void *a,const void *b);
int main()
{
//fin.open("1020.txt",ios::in);
int t;
cin>>t;
while(t--)
{
cin>>s>>n;
int i;
int sum=0;
for(i=0;i<n;i++)
{
cin>>a[i];
sum+=(a[i]*a[i]);
c[i]=true;
}
for(i=0;i<s;i++)
b[i]=0;
qsort(a,n,sizeof(a[0]),cmp);
if((s*s)==sum&&dfs(0))
cout<<"KHOOOOB!"<<endl;
else
cout<<"HUTUTU!"<<endl;
}
system("pause");
return 0;
}
bool dfs(int t)
{
if(t==n)
return true;
int i;
int min=100;
int index=-1;
//ÕÒµ½µ±Ç°¸ß¶È×îСµÄÁÐ
for(i=0;i<s;i++)
if(min>b[i])
{
min=b[i];
index=i;
}
//cout<<index<<":";
for(i=0;i<n;i++)
{
if(!c[i])
continue;
//index ´ú±íµÄÊǵ±Ç°×îСÁеÄindex
if(index+a[i]>s||b[index]+a[i]>s)
continue;
//¼ÆË㵱ǰµÄ·½¿éÊDz»ÊÇ¿ÉÒÔÌî³ä
int j;
bool f=true;
for(j=index;j<a[i]+index;j++)
{
if(b[j]>b[index])
{
f=false;
break;
}
}
//µ±Ç°µÄ·½¿é¿ÉÒÔÌî³ä³É¹¦
if(f)
{
int k;
for(k=index;k<a[i]+index;k++)
b[k]+=a[i];
/*for(int p=0;p<s;p++)
cout<<b[p]<<" ";
cout<<endl;*/
c[i]=false;
if(dfs(t+1))
return true;
c[i]=true;
for(k=index;k<a[i]+index;k++)
b[k]-=a[i];
}
}
return false;
}
int cmp(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
}
超时的原因:相同长度的方块的搜索多次。
有点贪心算法的感觉。