HDU 1536 S-Nim (SG函数)

来源:互联网 发布:软件流程图模板 编辑:程序博客网 时间:2024/06/05 03:01

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1536

题意:有若干堆石子,每次可以从任意一堆石子中取若干颗(数目必须在集合S中),问谁会获胜。

思路:SG函数的应用,具体可看http://blog.csdn.net/zhoufenqin/article/details/7903741


#include<cstdio>#include<cstring>#include<vector>#include<map>#include<iostream>#include<algorithm>using namespace std;typedef long long ll;const int maxn = 100 + 10;const int maxv = 10000 + 10;int S[maxn], sg[maxv], vis[maxv], a[maxn];int ns, cnt;void init() {  memset(sg, 0, sizeof sg);  for(int i = 1; i < maxv; i++) {    ++cnt;    for(int j = 0; j < ns; j++) if(i - S[j] >= 0)      vis[sg[i - S[j]]] = cnt;    for(int j = 0; ; j++) if(vis[j] != cnt) {      sg[i] = j;      break;    }  }}int main() {      while(scanf("%d", &ns) && ns) {    for(int i = 0; i < ns; i++) scanf("%d", &S[i]);    init();    int T;    scanf("%d", &T);    while(T--) {      int n;      scanf("%d", &n);      int sum = 0;      for(int i = 0; i < n; i++) {        scanf("%d", a+i);        sum ^= sg[a[i]];      }      if(sum) printf("W");      else printf("L");    }    printf("\n");  }  return 0;  }




0 0
原创粉丝点击