标签:bsp iostream div 相同 必须 end get ref set
网址: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 博弈论
标签:bsp iostream div 相同 必须 end get ref set
原文地址:https://www.cnblogs.com/Aya-Uchida/p/11185265.html