poj 2960 S-Nim(sg函数)
2012-03-26 11:09
190 查看
【题目大意】:给出一个集合S,然后给出n堆石子。每次可以从石子里取走S集合里面的数。问先手的胜负关系。
【解题思路】:Nim博弈的变形。加上了限制,跟距sg函数,我们可以知道。ans=sg(a)^sg(b)^sg(c)...(a,b,c为子问题,即每堆石子)。另外...sg(a)=mex(SG[a-s[i]])(0<i<k-1)....结束。
【代码】:
【解题思路】:Nim博弈的变形。加上了限制,跟距sg函数,我们可以知道。ans=sg(a)^sg(b)^sg(c)...(a,b,c为子问题,即每堆石子)。另外...sg(a)=mex(SG[a-s[i]])(0<i<k-1)....结束。
【代码】:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <cmath> #include <string> #include <cctype> #include <map> #include <iomanip> using namespace std; #define eps 1e-8 #define pi acos(-1.0) #define inf 1<<30 #define linf 1LL<<60 #define pb push_back #define lc(x) (x << 1) #define rc(x) (x << 1 | 1) #define lowbit(x) (x & (-x)) #define ll long long int s[500]; int sg[10010]; int n,T,m; int solve_sg(int x){ if (sg[x]!=-1) return sg[x]; int vis[10010]={0}; for (int i=0; i<n; i++){ if (x>=s[i]){ int tmp; tmp=solve_sg(x-s[i]); vis[tmp]=1; } } int cnt=0; while (vis[cnt]) cnt++; sg[x]=cnt; return cnt; } int main() { while (~scanf("%d",&n)){ if (n==0) break; memset(sg,-1,sizeof(sg)); for (int i=0; i<n; i++) scanf("%d",&s[i]); scanf("%d",&T); for (int i=0; i<T; i++){ scanf("%d",&m); int ans,tmp; ans=0; for (int j=0; j<m; j++){ scanf("%d",&tmp); ans=ans^solve_sg(tmp); } if (ans==0) printf("L"); else printf("W"); } printf("\n"); } return 0; }
相关文章推荐
- POJ-2960(S-Nim)——博弈论,SG函数
- POJ 2960 S-Nim【SG函数的应用】
- POJ 2960 S-Nim (sg函数)
- POJ 2960 S-Nim (sg函数)
- hdu 1536 S-Nim|| poj 2960 S-Nim (sg函数)
- POJ2960 S-Nim(博弈论:sg函数)
- poj2960——S-Nim(SG函数)
- sg函数_____S-Nim( poj 2960 )
- POJ 2960 S-Nim 【博弈论,SG函数】
- POJ-2960-S-Nim(SG函数)
- POJ 2960 S-Nim 博弈论,SG函数
- POJ 2960 S-Nim <SG函数>
- poj 2960 S-Nim(SG函数)
- ACM-SG函数之S-Nim——hdu1536 hdu1944 poj2960
- poj2960 S-Nim(博弈SG函数)
- HDU1536 或者POJ2960 S-Nim 传说中的SG函数
- sg函数 poj 2960 S-Nim
- POJ 2960 S-Nim<博弈>
- [poj 2960]S-Nim
- poj-2960 S-Nim (博弈SG)