您的位置:首页 > 其它

【HDOJ1536】S-Nim(博弈)

2016-08-06 14:16 501 查看
记录一个菜逼的成长。。

大致题意:

给你一个a数组 每次可以取a[i]个,q次询问,每次询问 共有m堆,因为sg函数是一堆的,所以将每堆的sg值异或就是答案。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000 + 10;
int s[110];
int sg[maxn];
bool Hash[maxn];   //bool 换成 int 就会超时。。原因在于sg_solve函数里的memset..
void sg_solve(int *a,int n)
{
memset(sg,0,sizeof(sg));
for( int j,i = 1; i <= maxn - 5; i++ ) {
memset(Hash,0,sizeof(Hash));
for( j = 0 ; j < n; j++ ){
if(i - a[j] >= 0)Hash[sg[i-a[j]]] = 1;
}
for( j = 0; j <= maxn - 5; j++ )
if(!Hash[j])break;
sg[i] = j;
}
}
int main()
{
int n,m,ans,q;
while(~scanf("%d",&n),n){
for( int i = 0; i < n; i++ )
scanf("%d",s+i);
sg_solve(s,n);
scanf("%d",&q);
while(q--){
scanf("%d",&m);
ans = 0;
for( int i = 0,x; i < m; i++ ){
scanf("%d",&x);
ans ^= sg[x];
}
printf("%c",ans?'W':'L');
}
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  博弈 sg Nim