神秘代码: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;
}

京公网安备 11010502036488号