一.题目

​ Tokitsukaze, CSL and Stone Game

​ Tokitsukaze和CSL正在玩一些石头游戏。

​ 一开始,有n堆的石头,第i堆石头数记为 \(a_i\),两人轮流操作。 Tokitsukaze先行动。 在每个回合中,玩家选择非空的一堆石头并从中移除一块石头。 如果在操作前每堆都是空的,或者如果在移除石头之后,有两堆(可能是空的)包含相同数量的石头,则该玩家输了。 假设两位球员都采取最优方案,谁将赢得比赛?

​ 考虑一个例子: n = 3,\(a_1\)=2, \(a_2\)=3, \(a_3\)=0.选择空堆是不可能的,因此Tokitsukaze有两种选择:从第一堆和第二堆中拿走一块石头。当他从第一堆拿石头后,\(a_1\)=1, \(a_2\)=3, \(a_3\)=0,这是可行的;当他从第二堆拿石头后,\(a_1\)=2, \(a_2\)=2, \(a_3\)=0,他会立即输掉。因此他只能从第一堆拿石头。

​ 假设两人总是采取最佳方案并且永远不会犯错误,谁将赢得比赛?

​ 请注意,即使最初有两堆的石头数目相同,Tokitsukaze仍然可以进行有效的第一步,只需要在拿走石头后没有两堆的石头数目相同即可。

输入

​ 第一行包含一个整数 n (\(1 ≤ n ≤ 10^5\))代表石堆数

​ 第二行包含 n个 整数 \(a_1,a_2,...,a_n(0≤a_i≤10^9)\)

输出

​ 如果Tokitsukaze赢,打印\(“sjfnb”\);如果CSL赢,打印\(“cslnb”\);请注意,输出字符区分大小写,且没有引号

Examples

input

1
0

output

cslnb

input

2
1 0

output

cslnb

input

2
2 2

output

sjfnb

input

3
2 3 1

output

sjfnb

注意

在第一个例子中,Tokitsukaze不能拿任何石头,所以CSL将获胜。

在第二个例子中,Tokitsukaze只能从第一堆中获取一块石头,然后,即使它们没有石头,这两堆也将拥有相同数量的石头,这意味着CSL将获胜。

在第三个例子中,Tokitsukaze将获胜。 :

  • 首先,Tokitsukaze可以选择第一堆并从那堆中取出一块石头。
  • 然后,CSL只能选择第一堆,因为如果他选择第二堆,他将立即失去。
  • 最后,Tokitsukaze可以选择第二堆,然后CSL将别无选择,只能输。

在第四个例子中,他们在任何时候都只有一个不错的选择,因此Tokitsukaze可以让游戏持续尽可能长的时间并最终获胜。

二.解题思路

首先用数组a来依次存入\(a_i\);

我们可以定义石头数量相同的两堆为一个“pair”。我们来考虑三种情况:

  1. 当初始状态中有两个pair时,那么无论第一个人破坏哪一个pair,都会有两堆的石头数相同,他必输。

  2. 当初始状态中没有pair(即不存在有相同数量的两堆石头):

    ​ 我们先对数组\(a\)进行升序排序。可以发现:

    ​ a.在每人拿走一块石头后,一定有\(a[i]>a[i-1]\)

    ​ b.数组a从0开始存的情况下,一定有第i堆石头数\(a[i-1]>=i-1\).因为第一堆最少为0块,第二堆至少比第一堆多1,即第二堆最少有一块,递推得第\(i\)堆最少有\(i-1\)块石头。

    ​ c.当\(a[0]=0,a[1]=1,...,a[n-1]=n-1\)时,下一个人已经无路可走,我们可以称该状态为必输状态

    ​ d.在pair=0的情况下,任何初始状态都会演变成必输状态

    ​ 因此,当前状态变成必输状态若经过了奇数次操作(即拿走了奇数块石头),第一个人Tokitsukaze赢;而经过了偶数次操作,第二个人CSL赢。

    3.当初始状态中仅有一个pair(即仅存在两堆有相同数量的石头),情况和pair=0类似,对数组a升序排序后任然满足a-c三条规律,不过会出现第一个人连第一步都无法进行的初始状态:

    ​ 记第index堆和第index+1堆有相同的石头数,则a[index]=a[index+1],当a[index-1]=a[index]-1时,当前状态也是一种必输状态,因此需要特判一下,在破坏唯一的pair时,会不会又出现两堆有相同的石头数量。

三.AC代码

#include<bits/stdc++.h>
using namespace std;
int a[100005];
typedef long long LL; int main(){
int n,num=0,index;
LL sum=0,aim=0;
cin>>n;
aim=(LL)n*(LL)(n-1)/2;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
for(int i=0;i<n-1;i++){
if(a[i]==a[i+1]){
num++;index=i;
}
}
if(num>=2) {cout<<"cslnb";return 0;}
if(num==0){
for(int i=0;i<n;i++) sum+=(LL)a[i];
if((sum-aim)%2) {cout<<"sjfnb";return 0;}
else {cout<<"cslnb";return 0;}
}
else{
if(a[index]==0) {cout<<"cslnb";return 0;}
if(index==0||a[index-1]!=a[index]-1){
for(int i=0;i<n;i++) sum+=(LL)a[i];
if((sum-aim)%2) {cout<<"sjfnb";return 0;}
else {cout<<"cslnb";return 0;}
}
else cout<<"cslnb";
}
return 0;
}

Codeforces Round #573 (Div. 2) D题题解的更多相关文章

  1. Codeforces Round #612 (Div. 2) 前四题题解

    这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...

  2. Codeforces Round #579 (Div. 3) 套题 题解

    A. Circle of Students      题目:https://codeforces.com/contest/1203/problem/A 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...

  3. Codeforces Round #741 (Div. 2)部分题题解

    我果然还是太菜了,就写了两道题....真是水死了.... A The Miracle and the Sleeper 简化题意:给定\(l,r\),求\(a\)%\(b\)的最大值,其中\(r> ...

  4. Codeforces Round #744 (Div. 3) G题题解

    淦,最后一道题没写出来,...还是我太菜了,不过这个题确实比较有趣. G. Minimal Coverage 简化题意:就是你处在坐标轴的0点上,给你一个序列\(a_i\),每次你可以选择向左走\(a ...

  5. Codeforces Round #573 (Div. 1) 差F

    Codeforces Round #573 (Div. 1) E 题意:二维平面上有 n 个点,你可以放至多 m 条直线使得 (0,0) 与每个点的连线至少与一条直线相交.求原点与所有直线的距离最小值 ...

  6. Codeforces Round #378 (Div. 2) D题(data structure)解题报告

    题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...

  7. Codeforces Round #713 (Div. 3)AB题

    Codeforces Round #713 (Div. 3) Editorial 记录一下自己写的前二题本人比较菜 A. Spy Detected! You are given an array a ...

  8. Codeforces Round #552 (Div. 3) A题

    题目网址:http://codeforces.com/contest/1154/problem/ 题目意思:就是给你四个数,这四个数是a+b,a+c,b+c,a+b+c,次序未知要反求出a,b,c,d ...

  9. Codeforces Round #198 (Div. 2)A,B题解

    Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...

随机推荐

  1. openswan协商流程之(四):main_inI2_outR2()

    主模式第四包:main_inI2_outR2 1. 序言 main_inI2_outR2()函数是ISAKMP协商过程中第四包的核心处理函数的入口,同时在此处理流程中已经获取到足够的隧道信息,可以生成 ...

  2. Element UI:级联选择器Cascader_动态加载_多级请求不同接口(已知第一级调取第二级)

    ELEMENT UI_CASCADER 使用过饿了么级联动态加载的小伙伴应该都知道,lazyLoad本身是一个无差别返回渲染结点的函数. 当我们存在一个需求:已知级联选择器的第一级结点,现在需要通过第 ...

  3. python库--pandas--部分实例

    >>> pd.pivot( index=np.array(['one', 'one', 'one', 'two', 'two', 'two']), columns=np.array( ...

  4. Spring Boot中有多个@Async异步任务时,记得做好线程池的隔离!

    通过上一篇:配置@Async异步任务的线程池的介绍,你应该已经了解到异步任务的执行背后有一个线程池来管理执行任务.为了控制异步任务的并发不影响到应用的正常运作,我们必须要对线程池做好相应的配置,防止资 ...

  5. DP之背包经典三例

    0/1背包 HDU2602 01背包(ZeroOnePack): 有N件物品和一个容量为V的背包,每种物品均只有一件.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大 ...

  6. ecshop transport.js IE报错(608行),对象不支持此属性或方法 的解决办法

    解决办法: 将if (this.hasOwnProperty(k)) { 改为: if (this.hasOwnProperty && this.hasOwnProperty(k)) ...

  7. Java基础系列(10)- 类型转换

    类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换.运算中,不同类型的数据先转换为同一类型,然后进行运算. 低 ------------------------------ ...

  8. java基础之AQS

    Java开发中,我们的应用程序经常会使用多线程提高程序的运行效率,多线程情况下访问线程共享变量可能会带来并发问题,此时就需要并发锁解决并发问题.Java提供了两种类型的并发控制机制:synchonri ...

  9. requests接口自动化-动态关联text/html格式

    动态关联,前一个接口返回的值为后一个接口请求的参数. # 动态关联 import requests def test_cookies(): # 以百度为例 r_baidu=requests.get(' ...

  10. phpstoem破解

    https://blog.csdn.net/voke_/article/details/78794567