HDU - 1847Good Luck in CET-4 Everybody!

xiaoxiao2021-02-28  26

题目:

总共n张牌;  双方轮流抓牌;  每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…)  抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;  假设Kiki和Cici都是足够聪明,并且每次都是Kiki先抓牌,请问谁能赢呢? 

思路:求出n的sg值,sg>0先手必胜,sg=0先手必败

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<algorithm> #include<ctime> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<list> #include<numeric> using namespace std; #define LL long long #define ULL unsigned long long #define INF 0x3f3f3f3f #define mm(a,b) memset(a,b,sizeof(a)) #define PP puts("*********************"); template<class T> T f_abs(T a){ return a > 0 ? a : -a; } template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; } template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;} // 0x3f3f3f3f3f3f3f3f //0x3f3f3f3f const int maxn=1e3+50; int arr[15]; int sg[maxn]; bool mex[10*maxn]; void init_sg(int n){ for(int i=0;i<=n;i++){ mm(mex,false); for(int j=0;j<=10;j++){ int x=arr[j]; if(i>=x) mex[sg[i-x]]=true; else break; } for(int j=0;;j++) if(!mex[j]){ sg[i]=j; break; } } } int main(){ int n; arr[0]=1; for(int i=1;i<=10;i++) arr[i]=2*arr[i-1]; init_sg(1000); while(~scanf("%d",&n)){ if(sg[n]>0) printf("Kiki\n"); else printf("Cici\n"); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-1000269.html

最新回复(0)