[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");
} }

[Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论)的更多相关文章

  1. Codeforces 1190B. Tokitsukaze, CSL and Stone Game

    传送门 不妨把每一堆按照石头数量从小到大排序 注意到每次只能拿一个石头,那么不论何时每堆石头的排名都是一样的 那么最终所有堆的状态一定就是 $0,1,2,...,n-1$,现在每一堆最终的石头数量都确 ...

  2. Codeforces Round #573 (Div. 2) D. Tokitsukaze, CSL and Stone Game (博弈,思维)

    D. Tokitsukaze, CSL and Stone Game time limit per test1 second memory limit per test256 megabytes in ...

  3. D. Tokitsukaze, CSL and Stone Game ( 取石子游戏?no,更像棋盘游戏 )

    去吧,皮皮虾 题意:  有 n 堆石子,每堆有 a[ i ] 个,然后每次 操作 可以选择任意一堆 石子,取走一个. 若你取完了之后,存在两堆石子,他们的个数一样多,你就输了( 包括两堆都是0个), ...

  4. 题解 CF1190B 【Tokitsukaze, CSL and Stone Game】

    思路: 首先题目告诉我们,一次只能删去一个石子.当然有翻译时会注意,但是看英文题时总是容易忽略.. 先排序. 然后,你会发现,有些情况是一开始就输的,具体情况如下: 有两个 两个相等非零数.(a[x] ...

  5. Codeforces - 1191E - Tokitsukaze and Duel - 博弈论 - 尺取

    https://codeforc.es/contest/1191/problem/E 参考自:http://www.mamicode.com/info-detail-2726030.html 和官方题 ...

  6. Codeforces 1411G - No Game No Life(博弈论+生成函数+FWTxor)

    Codeforces 题面传送门 & 洛谷题面传送门 一道肥肠套路的题目. 首先这题涉及博弈论.注意到这里每一个棋子的移动方式都是独立的,因此可以考虑 SG 定理.具体来说,我们先求出每个棋子 ...

  7. CodeForces 455B A Lot of Games (博弈论)

    A Lot of Games 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/J Description Andrew, Fedo ...

  8. UVa 1378 A Funny Stone Game [博弈论 SG函数]

    A Funny Stone Game 题意: $n \le 23$堆石子,每次选择$i < j \le k$,从$i$拿走1颗$j,k$各放入一颗,不能取就失败.求先手是否必胜以及第一次取的策略 ...

  9. Codeforces 919F. A Game With Numbers(博弈论)

      Imagine that Alice is playing a card game with her friend Bob. They both have exactly 88 cards and ...

随机推荐

  1. linux服务器安全配置攻略

    引言: 最小的权限+最少的服务=最大的安全 所以,无论是配置任何服务器,我们都必须把不用的服务关闭.把系统权限设置到最小话,这样才能保证服务器最大的安全.下面是CentOS服务器安全设置,供大家参考. ...

  2. Textarea随着文本的字数自适应高度,后来发现用 contenteditable 代替textarea 效果更佳

    做移动端项目遇到很多问题,最近比如textarea 随着文本的字数自动撑开高度, 网上也查阅了一些资料发现比较有用的方法 就是获取 textarea的行数和换行符来动态改变textarea的高度  就 ...

  3. Python---面向对象---案例

    a = 5print(5/10)# 地板除(功能类似于数学模块当中floor()向下取整操作)print(5//10)print(a%10)b = 25print(b/10)print(b//10)p ...

  4. webpack中require.context 用法

    1.require.context(directory, useSubdirectories = false, regExp = /^\.\//) Examples: require.context( ...

  5. 【JavaScript】对象 obj.name 语法与 obj[name]语法

    obj.name ==> obj["name"]  底层的自动转化,所以直接写 obj["name"] 效率会高一些 var obj = { name: ...

  6. dnsmasq+Stunnel+sniproxy加密代理

    一.环境介绍 [root@kimissVPN ~]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@kimissVPN ~]# un ...

  7. Day_03-函数和模块的使用

    使用函数求阶乘 使用while循环的代码: m = float(input('m = ')) n = float(input('n = ')) mn = m - n fm = 1 while m != ...

  8. mysql PRIMARY KEY约束 语法

    mysql PRIMARY KEY约束 语法 作用:PRIMARY KEY 约束唯一标识数据库表中的每条记录. 环形直线电机 说明:主键必须包含唯一的值.主键列不能包含 NULL 值.每个表都应该有一 ...

  9. POJ 2385 Apple Catching ( 经典DP )

    题意 : 有两颗苹果树,在 1~T 的时间内会有两颗中的其中一颗落下一颗苹果,一头奶牛想要获取最多的苹果,但是它能够在树间转移的次数为 W 且奶牛一开始是在第一颗树下,请编程算出最多的奶牛获得的苹果数 ...

  10. python-之基本语法

    模块一些函数和类的集合文件,并实现一定的功能,当我们需要使用这些功能的时候,可以直接把相应的模块导入到我们的程序中 import import mode    #导入mode模块 即导入mode模块后 ...