Codeforces 1190B. Tokitsukaze, CSL and Stone Game
2024-08-30 23:27:49
不妨把每一堆按照石头数量从小到大排序
注意到每次只能拿一个石头,那么不论何时每堆石头的排名都是一样的
那么最终所有堆的状态一定就是 $0,1,2,...,n-1$,现在每一堆最终的石头数量都确定了
那么我们直接把每一堆的石头数量减去这一堆的排名,再加上 $1$,就得到每一堆能拿走的石头数量
那么此时就可以看成新的一些堆取石头,并且堆之间不要求不相等
显然只要没到最终状态就一定可以再拿石头
直接根据总石头数判断胜负即可
注意到如果不存在超过一对堆初始石头数量一样那么每一堆的石头数量一定不小于 $排名-1$
所以我们按上面的过程操作后不会存在某一堆石头数量为负的情况
初始时判断怎么取都有两堆一样的情况要仔细一点
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e5+;
ll n,a[N],sg;
int main()
{
n=read(); for(int i=;i<=n;i++) a[i]=read();
sort(a+,a+n+); ll cnt=,val=,zero=;
for(int i=;i<=n;i++) zero+=a[i]==;
if(zero>) { printf("cslnb\n"); return ; }//这里要特判0!!!
for(int i=;i<=n;i++)
if(a[i]==a[i-])
cnt++,val=a[i];
for(int i=;i<=n;i++) if(a[i]==val-) { printf("cslnb\n"); return ; }
if(cnt>) { printf("cslnb\n"); return ; }
for(int i=;i<=n;i++) sg+=a[i]-i+;
if(sg&) printf("sjfnb\n");
else printf("cslnb\n");
return ;
}
最新文章
- innerHTML与innerText的异同
- 共享有线实现手机上网,然后使用charles来抓包
- Jplayer(转)
- 解决导入lib,关联源码问题
- iOS学习之自定义UItableViewCell
- javascript自定义浏览器右键菜单
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
- linux 工具: Top
- ES6中函数新增的方式方法
- Python/ selectors模块及队列
- virtualenvwrapper 虚拟环境的使用 和 python 安装源的更改
- [UE4]在Character中使用Add Spline Mesh Component,关于Transform.Mobility
- Linux搭建 SVN 服务器
- 你确定你真的懂Nginx与PHP的交互?
- Windows Server 2012 R2 无法启用Microsoft .NET Framework 3.5 功能
- 设计模式_享元设计模式(flyweight)
- 【BZOJ4391】[Usaco2015 dec]High Card Low Card(贪心)
- PCL常见错误集锦
- [BZOJ3928/4048]Outer space invaders
- Gradle sync failed: Read timed out