神秘代码:lfggtxdy
H:http://codeforces.com/problemset/problem/1190/B
题意:两人取石子,面前有n堆石子,给你每一堆的数量 (可能为零)问你谁能获胜。
败北条件是:第一,在某一次行动时没有石子可取勒。第二,在某一次取石子后,剩下的石子堆中有任意两堆的数量恰好相等。
思路:很容易发现一般情况下最后想要胜利,石子堆的样子必然是0,1,2,3,4……。
接下来考虑一下特殊情况。第一,开局的时候给了你两个空堆,这时候先手必败。第二,开局时候有两个堆数量相等,而且还有一堆数量恰好是它们数量减一,这时候也是先手必败的。至此代码也就写出来了。
//author CN.TTDragon #include<bits/stdc++.h> typedef long long ll; const ll mod=1e9+7; const ll maxn=100000+7; const double pi=acos(-1); using namespace std; int a[maxn]; int main() { ios::sync_with_stdio(false); int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } sort(a,a+n); //特殊条件1 if(n>=2&&a[0]==0&&a[1]==0) { cout<<"cslnb"<<endl; return 0; } //2 for(int i=0;i<n-2;i++) { if(a[i+2]==a[i+1]&&a[i+1]==a[i]+1) { cout<<"cslnb"<<endl; return 0; } } //有很多二 int er=0; for(int i=0;i<n-1;i++) { if(a[i]==a[i+1]) { er++; if(er>=2) { cout<<"cslnb"<<endl; return 0; } } } //一般情况 ll sum=0; for(int i=0;i<n;i++) { sum+=a[i]; } if((sum-n*(n-1)/2)%2) { cout<<"sjfnb"<<endl; } else { cout<<"cslnb"<<endl; } return 0; }