网址: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;
}