博弈论。
可能大体上比较好想,中间有可能会漏掉一些细节。
可以先判断先手走一步必输的情况(
s
u
m
[
i
]
sum[i]
sum[i]表示
i
i
i出现的次数):
1
、
s
u
m
[
0
]
>
1
1、sum[0]>1
1、sum[0]>1
2
、
∀
i
2、\forall i
2、∀i
s
u
m
[
i
]
>
2
sum[i]>2
sum[i]>2
3
、
∀
i
,
j
3、\forall i,j
3、∀i,j
s
u
m
[
i
]
>
1
sum[i]>1
sum[i]>1&&
s
u
m
[
j
]
>
1
sum[j]>1
sum[j]>1
4
、
∀
i
>
1
4、\forall i>1
4、∀i>1
s
u
m
[
i
]
>
1
sum[i]>1
sum[i]>1&&
s
u
m
[
i
−
1
]
>
0
sum[i-1]>0
sum[i−1]>0
除此之外,可以判断可行动步数的奇偶性。
我们考虑
n
n
n堆石子,第
i
i
i堆有
i
−
1
i-1
i−1个石子,此时任意一人拿石子都会输。
因此可行动步数就是石子总数
−
(
1
+
2
+
…
…
+
(
n
−
1
)
)
-(1+2+……+(n-1))
−(1+2+……+(n−1))
C
o
d
e
:
Code:
Code:
#include<bits/stdc++.h>
using namespace std;
int n,a[100005];
int main()
{
scanf("%d",&n);
long long sum=0;
int k=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==0)k++;
sum+=a[i]-(i-1);
}
sort(a+1,a+n+1);
int s=0;bool flag=false;
for(int i=2;i<=n;i++)
if(a[i]==a[i-1])
{
s++;
if(a[i-1]==a[i-2]+1&&i-2>0)flag=true;
}
if(sum%2==0||s>=2||k>=2||flag)puts("cslnb");else
puts("sjfnb");
return 0;
}