[Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论)
[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(博弈论)的更多相关文章
- Codeforces 1190B. Tokitsukaze, CSL and Stone Game
传送门 不妨把每一堆按照石头数量从小到大排序 注意到每次只能拿一个石头,那么不论何时每堆石头的排名都是一样的 那么最终所有堆的状态一定就是 $0,1,2,...,n-1$,现在每一堆最终的石头数量都确 ...
- 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 ...
- D. Tokitsukaze, CSL and Stone Game ( 取石子游戏?no,更像棋盘游戏 )
去吧,皮皮虾 题意: 有 n 堆石子,每堆有 a[ i ] 个,然后每次 操作 可以选择任意一堆 石子,取走一个. 若你取完了之后,存在两堆石子,他们的个数一样多,你就输了( 包括两堆都是0个), ...
- 题解 CF1190B 【Tokitsukaze, CSL and Stone Game】
思路: 首先题目告诉我们,一次只能删去一个石子.当然有翻译时会注意,但是看英文题时总是容易忽略.. 先排序. 然后,你会发现,有些情况是一开始就输的,具体情况如下: 有两个 两个相等非零数.(a[x] ...
- Codeforces - 1191E - Tokitsukaze and Duel - 博弈论 - 尺取
https://codeforc.es/contest/1191/problem/E 参考自:http://www.mamicode.com/info-detail-2726030.html 和官方题 ...
- Codeforces 1411G - No Game No Life(博弈论+生成函数+FWTxor)
Codeforces 题面传送门 & 洛谷题面传送门 一道肥肠套路的题目. 首先这题涉及博弈论.注意到这里每一个棋子的移动方式都是独立的,因此可以考虑 SG 定理.具体来说,我们先求出每个棋子 ...
- CodeForces 455B A Lot of Games (博弈论)
A Lot of Games 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/J Description Andrew, Fedo ...
- UVa 1378 A Funny Stone Game [博弈论 SG函数]
A Funny Stone Game 题意: $n \le 23$堆石子,每次选择$i < j \le k$,从$i$拿走1颗$j,k$各放入一颗,不能取就失败.求先手是否必胜以及第一次取的策略 ...
- 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 ...
随机推荐
- webpack 零基础到工程实战(1)
webpack resolve:resolve 配置是帮助 webpack 查找依赖模块resolve.alias 是最常用的配置,通过设置 alias 可以帮助 webpack 更快查找模块依赖,而 ...
- MYSQL数据导出与导入,secure_file_priv参数设置
https://www.imooc.com/article/41883 MySQL 报错 [Code: 1290, SQL State: HY000] The MySQL server is run ...
- css 3D动画
一.今天让我们来学习一下css 3D吧! 1.首先我们要学习好css3 3d一定要有一定的立体感! 2.再来那就聊聊原理吧! 3.css3 3d 顾名思义是由两个2d名片组成的 但不是让你建立连个2d ...
- 一个简单SpringBoot应用的pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- 【JavaScript】对象 obj.name 语法与 obj[name]语法
obj.name ==> obj["name"] 底层的自动转化,所以直接写 obj["name"] 效率会高一些 var obj = { name: ...
- 前端面试题常考&必考之--http中的post和get的区别
从字面上看,post是发送,则是提交数据,get是获得,则是获取数据,没毛病,我们可以就按字面来理解 具体就看图吧 吐槽:插入的表格不好用,不知道是自己不会用还是真不好用,变成了截图,修饰了下子
- mybatis时间范围查询
<if test="excStartTime!=null and excStartTime!=''"> <![CDATA[ and DATE_FORMAT(dl. ...
- PHP开发工具PHP基础教程
PHP开发 工具PHP基础教程,以下是兄弟连PHP培训小编整理: PHP IDE PHP IDE也不少,主要从几个方面进行筛选: 跨平台(能够同时在windows,mac或者ubuntu上面运 ...
- ZeroMQ的进阶
上一篇博文我们对ZeroMQ的经典模式做了写Demo让他跑起来了,但实际开发中我们可能面临一些远比上述复杂的场景.这时候我们需要进一步的对经典模式进行扩展,所幸ZeroMQ已经为我们做好了准备工作. ...
- 洛谷 P4570 BZOJ 2460 [BJWC2011]元素
Time limit 20000 ms Memory limit 131072 kB OS Linux 解题思路 看题解可知 我们将矿石按照魔法值降序排序,然后依次将矿石编号放入线性基(突然想起线代里 ...