HDU 1536
Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language |
2013-07-24 10:17:33 | Accepted | 109MS | 476K | C++ |
#include<iostream>
#include<algorithm>
using namespace std;
//注意 S数组要按从小到大排序 SG函数要初始化为-1 对于每个集合只需初始化1遍
//n是集合s的大小 S[i]是定义的特殊取法规则的数组
int s[110],sg[10010],n;
int mex(int x)// 类似于记忆化搜索
{
int i;
bool vis[110]={0}; //vis数组的定义一定要在函数里
for (i=0;i<n;i++)
{
int t=x-s[i];
if (t<0) break;// 判断出界
if (sg[t]==-1)
sg[t]=mex(t);// 递归深入
vis[sg[t]]=1;// 进行标记
}
for(i=0;;i++)
{
if (!vis[i])
return i;
}
}
int main()
{
int i,m,t,num;
char cnt[110];
while(scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
scanf("%d",&s[i]);
memset(sg,-1,sizeof(sg));
sort(s,s+n);
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&t);
int ans=0;
while(t--)
{
scanf("%d",&num);
ans^=mex(num);
}
if(ans==0)
cnt[i]='L';
else
cnt[i]='W';
}
for(i=0;i<m;i++)
cout<<cnt[i];
printf("\n");
}
return 0;
}
SG函数 参考博文:http://www.cnblogs.com/frog112111/p/3199780.html
http://hi.baidu.com/liveroom/item/a43f122c0893d7caa5275a67