codeforces1191D Tokitsukaze, CSL and Stone Game 博弈论
Posted aya-uchida
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces1191D Tokitsukaze, CSL and Stone Game 博弈论相关的知识,希望对你有一定的参考价值。
网址:http://codeforces.com/problemset/problem/1190/B
题意:
给出n堆石头,两个人轮流从非空的石头堆中取一颗石头,如果某人开始前,石头已经被取完,或者取了之后,出现两堆石头数量相同,则输,假设两个人每次都会走最佳选择,求最后谁会赢。
题解:
结论:在自己取石头之后,石头堆是0,1,2,3......n-1时,必胜,故两方一定是想办法构造成这个样子。然后是特殊情况,如果已经有两个空堆,或者三堆相同,或者两堆相同且存在一堆比这堆少一个(5,5,4-》5,4,3-》4,4,3 or 5,3,3),则必然后手胜。
AC代码:
#include <iostream> #include <vector> #include <cmath> #include <cstring> #include <algorithm> using namespace std; int num[100005]; bool check(int n) if(n>=2&&num[0]==0&&num[1]==0) return 1; for(int i=2;i<n;++i)//连续三堆相同 if(num[i]==num[i-1]&&num[i-1]==num[i-2]) return 1; for(int i=2;i<n;++i) if(num[i]==num[i-1]&&num[i]==num[i-2]+1)//第一个必须取一个,第二个再取一个,相等,输 return 1; int cnt=0; for(int i=1;i<n;++i)//相同对 if(num[i]==num[i-1]) ++cnt; return cnt>1; int main() int n; cin>>n; for(int i=0;i<n;++i) cin>>num[i]; sort(num,num+n); if(check(n)) cout<<"cslnb"<<endl; return 0; long long sum=0; for(int i=0;i<n;++i) sum+=num[i]; if((sum-n*(n-1)/2)%2) cout<<"sjfnb"<<endl; else cout<<"cslnb"<<endl; return 0;
以上是关于codeforces1191D Tokitsukaze, CSL and Stone Game 博弈论的主要内容,如果未能解决你的问题,请参考以下文章