hdu 1847 SG递推入门

来源:互联网 发布:网络红酒业务员好做吗 编辑:程序博客网 时间:2024/06/13 01:06

点击打开链接

http://wenku.baidu.com/link?url=47DequTlLK6bfAMcuRauPRYbJ5ZU5P8ChR9Jgbg7ZY4dPgkaY8p1RReXAuRpsbal-sbL1QEVFl3btKX4sKce3cQQY4tbIpRNjK9ogyaQYfK

/mex{}集合中没有的最小非负整数 
g[x]=mex{g[yi]|yi为x的后继状态}

g[0]=0为必败态 非0为必胜态
如果g[x]后继状态都非0 则g[x]=0; 
 g[x]后继状态存在一个为0 则最优操作转移到该状态g[y]=0,则g[x]!=0 当前状态为必胜态 

#include <iostream>#include <algorithm>#include <cstring>#include <map>#include <set>using namespace std;typedef long long ll;const int N=1e4+20;int g[N],a[15];void calc(){g[0]=0;for(int i=1;i<N;i++){set<int> s;for(int j=0;j<15;j++){if(i>=a[j])s.insert(g[i-a[j]]);}if(s.size()==0)//没有状态能转移g[i]=0;else{bool flag=false;set<int>::iterator it;for(it=s.begin();it!=s.end();it++){if(*it==0){flag=true;//后继有一个为必败态 则x为必胜态 break;}}if(flag)g[i]=1;//代表非0 即必胜态 elseg[i]=0;}s.clear(); }}int main(){a[0]=1;for(int i=1;i<15;i++)a[i]=1<<i;calc();//递推求SG函数 int n;while(cin>>n){if(g[n])cout<<"Kiki"<<endl;elsecout<<"Cici"<<endl;}return 0;}


0 0
原创粉丝点击