[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 ...
随机推荐
- Thymeleaf静态资源引入方式及公共页面代码抽取
静态资源引入 Thymeleaf模板引擎url问题,要用如下的方式写,确保在任何情况下都能访问到 <!-- Bootstrap core CSS --> <link href=&qu ...
- CentOS6.5 安装gitlab以及gitolite迁移gitlab
CentOS6.5 安装gitlab以及gitolite迁移gitlab gitlab 的安装使用以及数据结构 安装 环境: CentOS6.5 基于 nignx + unicorn 搭建的应用环境, ...
- Apache+Mysql+PHP 套件
Apache+Mysql+PHP 套件 最近要装个Apache+Mysql+PHP的一个环境. google下后,发现现在的安装变得越来越简单了.不再需要麻烦的配置安装,只需简单执行个sh就搞定了 ...
- SQL Server性能调优--优化建议(一)
序言 当数据量小的时候,SQL优化或许无关紧要,但是当数据量达到一定量级之后,性能优化将变得至关重要,甚至决定系统成败. 定位慢查询 查询编译以来cpu耗时总量最多的前50条 --查询编译以来 cpu ...
- 封装Qt的SQLite接口类
还没测试完善.. #ifndef SQLITE_H #define SQLITE_H #include <QSqlDatabase> #include <QSqlQuery> ...
- Count on a tree(树上路径第K小)
题目链接:https://www.spoj.com/problems/COT/en/ 题意:求树上A,B两点路径上第K小的数 思路:主席树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表上. ...
- (实战)多边形,梯形盒阴影css实现技巧
一般情况下,我们给块状元素(四边形)添加阴影样式,直接用css box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);就可以了,但是总有一些需求是那么的特别,例如下图: ...
- Java 什么是守护线程
前言 守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程,这是它的作用——而其他的线程只有一种,那就是用户线程.所以java里线程分2种, 1.守护线程,比如垃圾回收 ...
- 手机H5设计尺寸
手机型号 导航栏和状态栏的高度 宽度 高度 可视区域高度 iPhone 4 (4, 4S) 64px 320px 480px 416px iPhone 5 (5c, 5s) 64px 320px 56 ...
- Oracle JET(一)Oracle JET介绍
Oracle JET (Oracle Javascript Extension Toolkit)是一款 Oracle 的 JavaScript 拓展工具包.简单来说 Oracle JET 是一个一堆好 ...