[Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论)

题面

有n堆石子,两个人轮流取石子,一次只能从某堆里取一颗。如果某个人取的时候已经没有石子,或者取完后又两堆石子个数相同(个数为0也算)。假如两人都足够聪明,问谁能赢。

分析

贪心考虑,最后局面一定是0~n-1的一个排列。这时谁取谁就输。因此我把a[i]从小到大排序,把a[i]变成i-1,可以计算出取的石子个数\(\sum (a_i-i+1)\),如果是奇数,则先手胜,否则后手胜。

但是要排除一些取1颗就会输的情况,记石子个数x的出现次数为cnt[x],有4种情况先手必败

\(cnt[0]>1\)

$ \exist x,cnt[x]>2$

\(\exist x,y \ , cnt[x]>1,cnt[y]>1\)

\(\exist x, cnt[x]>1,cnt[x-1]>0\)

代码

#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
#define maxn 100000
using namespace std;
int n;
int a[maxn+5];
map<int,int>cnt;
bool check(){
if(cnt.count(0)&&cnt[0]>1) return 0;
for(auto x : cnt){//有出现次数超过2的
if(x.second>2) return 0;
}
int num=0;
for(auto x : cnt){
if(x.second>1) num++;
}
if(num>=2) return 0;//有2个出现次数超过1的
for(auto x : cnt){
if(x.second>1&&cnt.count(x.first-1)) return 0;
//x出现>1次,x-1出现,无论先取x还是先取x-1都会造成相同
}
return 1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
cnt[a[i]]++;
}
if(!check()){//检查初始情况
printf("cslnb\n");
}else{
long long sum=0;
//最优取法,从小取到大,第i堆取到i-1个,这样不会出现相同
//因为是轮流取,再判断一下奇偶性,看看下一步谁取,取的就输
for(int i=1;i<=n;i++){
sum+=a[i]-(i-1);
}
if(sum%2==1) printf("sjfnb\n");
else printf("cslnb\n");
} }

最新文章

  1. Android Studio同时打开多个项目
  2. 【jQuery EasyUI系列】创建CRUD数据网格
  3. 解决安装sql server 需要重启问题
  4. libuv里的几个缺陷
  5. DUBBO本地搭建及小案例
  6. Android通过Apk插件调起微信支付
  7. 64位win7下安装Boost 1.59.0 + boost.python 1.59.0 + gccxml + pygccxml + pyplusplus(py++)
  8. Hadoop系列003-Hadoop运行环境搭建
  9. python_while
  10. Jquery实现轮播公告
  11. npm 是干什么的
  12. Flask-论坛开发-4-知识点补充
  13. Linux驱动技术(三) _DMA编程【转】
  14. perl 遍历文件夹,获取全部文件
  15. &lt;spark&gt; error:启动spark后查看进程,进程中master和worker进程冲突
  16. [BUG] Dashboard报错:if usages[&#39;subnets&#39;][&#39;available&#39;] &amp;lt;= 0: KeyError: &#39;available&#39;
  17. uid列表来讲讲我是如何利用php数组进行排重的
  18. js 动态增加行删除行
  19. Ubuntu 分区方安
  20. POJ 2051 argus(简单题,堆排序or优先队列)

热门文章

  1. 字符编码 python2与python3的区别
  2. Centos 6.4 x86_64 最小化安装后的优化——还需要整理
  3. css常用小知识点汇总(一)
  4. 3D打印格式STL
  5. webstorm注册码,亲测2016.1.1版
  6. tapmode=&quot;hover&quot;属性
  7. android 开发,视频群聊引发短信异常
  8. Hello Kotlin! Kotlin学习资料
  9. Netflow elasticflow
  10. Booting the Linux/ppc kernel without Open Firmware