D. Tokitsukaze, CSL and Stone Game
https://codeforces.com/contest/1191/problem/D
题意:n堆石子,谁最后没有石子可取谁输,谁取完之后存在两堆相等的石子数谁输。
分情况:
1、只有一堆石子只需判断奇偶。
2、多于两堆:先手输:存在两堆相等数超过两对、存在三堆相等、存在两个0堆、只存在一对两堆(a)相等且存在一堆数为(a-1)。
3、除去以上情况后,排序,最终每个数可走a[i] - i - 1 步,判断奇偶即可。
//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <string>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <string.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF 0x3f3f3f3f
#define mod 1000000007
#define PI acos(-1)
using namespace std;
typedef long long ll ;
int a[100009];
map<int , int>m;
int main()
{
int n ;
scanf("%d" , &n);
for(int i = 0 ; i < n ; i++)
{
scanf("%d" , &a[i]);
}
if(n == 1)
{
if(a[0] % 2 == 0)
{
cout << "cslnb" << endl;
}
else{
cout << "sjfnb" << endl ;
}
}
else
{
int flag1 = 0 , flag2 = 0 ;
for(int i = 0 ; i < n ; i++)
{
m[a[i]]++ ;
if(m[a[i]] >= 2)
{
flag1++ ;
}
}
if(flag1 >= 2|| m[0] >= 2)
{
cout << "cslnb" << endl;
}
else{
ll sum = 0 ;
sort(a , a+n);
for(int i = 1 ; i < n ; i++)
{
if(a[i] == a[i-1])
{
if(i >= 2 && a[i] == a[i-2]+1)
{
cout << "cslnb" << endl ;
return 0 ;
}
}
}
for(int i = 0 ; i < n ; i++)
{
sum += a[i] - i ;
}
if(sum % 2 == 0)
{
cout << "cslnb" << endl ;
}
else{
cout << "sjfnb" << endl ;
}
}
}
return 0 ;
}

浙公网安备 33010602011771号