poj 2960 S-Nim (SG函式)
阿新 • • 發佈:2018-12-15
題目連結:哆啦A夢傳送門
題意:nim遊戲變形,只不過每次取得個數只能在集合S{s1,s2,...,sk}選一個來取,
輸入k,表示緊接著S集合有k個元素
輸入m,表示m次詢問,每次給一個數l,表示有l堆,每堆的數量。
先手win,輸出 “W”,否則,輸出“L”。
題解:直接寫個SG函式就行了。
注意一點的是,集合元素值要排序一下,不然會出錯。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=10010; int f[110],book[110]; int SG[maxn]; int k; void getSG() { memset(SG,0,sizeof(SG)); SG[0]=0; for(int i=1;i<maxn;i++) { memset(book,0,sizeof(book)); for(int j=0;f[j]<=i&&j<k;j++){ book[SG[i-f[j]]]=1; } for(int j=0;;j++){ if(!book[j]){ SG[i]=j;break; } } } } int main() { while(scanf("%d",&k)&&k) { for(int i=0;i<k;i++) scanf("%d",&f[i]); sort(f,f+k); ///排序一下,不排會wa getSG(); int m,num,item; int sum=0; scanf("%d",&m); while(m--) { scanf("%d",&num); sum=0; while(num--) { scanf("%d",&item); sum^=SG[item]; } if(sum) printf("W"); else printf("L"); } puts(""); } return 0; }