Problem - 1190B - Codeforces
题目大意:有 n n n堆石子,每堆的数目为 a i a_i ai,现在Alice和Bob两个人可以移走任意一堆不为空的石子中的一颗石子,如果某人移动完石子后,有两堆的石子数相同,那么另一个人获胜;如果某人当前没有可移动的石子,另一个人同样获胜。
题目大意:我们思考两种情况。
一种情况是当前局面已经存在只要移动就一定会失败的情况。那么此时至少有两对组合满足石子个数 a i = a j a_i=a_j ai=aj,或者是形如 2 , 3 , 3 2,3,3 2,3,3这种情况,无论怎么移动都会有相同石子。
第二种情况是两人最优取法最多能取多少个,最优的取法一定是不断地取,最终让石子堆形成一个从 0 0 0开始的严格递增序列,那么我们计算一下最终可取的个数,判一下奇偶就可以了。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define syncfalse ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
const int N = 1e5+5;
ll a[N];
int main(){
syncfalse
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n;
cin>>n;
for (int i = 1; i <= n; ++i)cin>>a[i];
sort(a+1, a+1+n);
bool flag = false;
for (int i = 1; i <= n; ++i){
if (a[i])flag=true;
}
ll sum = 0;
int num = 0;
for (int i = 2; i <= n; ++i){
if (a[i]==a[i-1]){
if (a[i]==0)flag=false;
else num++;
}
}
if (num>1)flag=false;
for (int i = 2; i < n; ++i){
if (a[i]==(a[i-1]+1)&&a[i]==a[i+1])flag=false;
}
for (int i = 1; i <= n; ++i){
ll tem = a[i]-i+1;
if (tem<0)flag=false;
sum+=tem;
}
if (sum%2==0)flag=false;
if (!flag)cout << "cslnb\n";
else{
cout << "sjfnb\n";
}
return 0;
}