题意:时津风和蔡队玩取石头游戏,有n堆石头,双方轮流取,每次只能取一个石子。没得取或者取完出现两堆数量一样的(0也算)的人输。
这题不用到博弈的多少知识,随便想想就好了。首先特判已经相同的堆,大于等于三个相同的必输。两个堆相同则必须取这个,先模拟一步操作。然后就是所有堆不同了,显然经过很多轮后最终会达到0~n-1各出现一个的必败局面,所以排序算总移动次数的奇偶就行了。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
#define inc(i,n) for (ll i=0;i<n;i++)
int p[1000010];
int main(){
int n,sm=0; cin>>n;
for (int i=1;i<=n;i++) scanf("%d",p+i);
sort(p+1,p+n+1); p[0]=-1;
int d=0;
for (int i=1;i<n;i++){
if (p[i+1]==p[i]){
sm++;
if (sm>1 || p[i-1]==p[i]-1) return puts("cslnb"),0;
p[i]--; d=1;
}
}
ll sum=0;
for (int i=1;i<=n;i++) sum+=p[i]-i+1;
if ((sum & 1) ^ d) puts("sjfnb");
else puts("cslnb");
return 0;
}