CF1190B
扯在前面
我们老师刚讲过的题目,很考验思维,本蒟蒻WA了十发才过,然后看到题解里只是指出了特殊情况没多解释,可能有人看不懂,特来分享一下
首先题目就很有意思,思考的过程也很有趣,想把所有情况思考全思考对是件很不容易的事
正文
题意:
两人取n堆数量不定的石子,当某一方取完后剩下了两堆一样的或本轮无石子可取(当前石子数为0),则失败。问给出石子各堆的数量,求先手胜还是后手胜。
分析:
首先,站在博弈论的角度,或者说把自己当做参与者,思考一下什么情况下是对自己最有利的,也就是说什么情况下自己必胜
然后抱着这样的心态,我们可以手玩几组样例。
我们就可以知道:
若场上有两堆石子,一堆数量多一堆数量少,那我们宁可取少的,因为那样出现取完后两堆相同的概率最低;
当两边都这样想时,就会不停取,一直取到一种极端情况,那就是每堆石子的数量是以一递增的,那时游戏就结束了,因为不管再怎么取,都会出现两堆相同数量的石子(两堆0也是);
当场上已经有两堆相同的石子时,下一次操作的人必取两堆其中之一,因为他如果不取,取完后这两堆相同,他就输了;
若刚刚那人取完后,场上仍存在两堆相同的,他还是输了,即当时还存在一堆石子数量是刚刚那两堆数量减一或场上存在另外两堆以上数量相同但与这两堆数量不同的石子
若场上存在三堆及以上石子时,先手无论怎么取,都会输,原因同上
然后可得出情况如下可以判断某方必胜:
- 场上石子数已经是按1递增的
- 场上存在三堆及以上石子相等
- 场上存在两堆石子相同且还有一堆石子数比这两堆少一
- 场上存在两堆0
这些先判断出来,剩下的统计原来的石子总数与极端情况的石子总数之差,若为偶数则后手赢,反之则先手赢
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>
#define maxn 1000100
using namespace std;
int n,a[maxn],tot,cnt,js;
int main(){
scanf("%d",&n);
// if(n==1 &&a[1]==0){
// cout<<"cslnb";
// return 0;
// }
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
tot+=a[i];
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
if(a[i]==a[i+1]) js++;
}
if(js>=2){
cout<<"cslnb";//有两堆以上一样的时后手必赢
return 0;
}
if(js==1){
for(int i=1;i<=n;i++){
if((a[i]==a[i+1] &&a[i-1]+1==a[i] && i!=1) ||(a[i]==a[i+1] &&a[i]==0)){
cout<<"cslnb";//此时先手无所下手,后手赢
return 0;
}
}
}
// if(n==2 &&((a[1]==1&&a[2]==0) ||(a[2]==1 &&a[1]==0))){
// cout<<"sjfnb";
// return 0;
// }
for(int i=1;i<=n;i++){
cnt+=i;
}
cnt-=n;
if(tot-cnt==0){
cout<<"cslnb";
return 0;
}
if((tot-cnt)%2==0) cout<<"cslnb";
else cout<<"sjfnb";
return 0;
}
请批评指正
CF1190B的更多相关文章
- 题解 CF1190B 【Tokitsukaze, CSL and Stone Game】
思路: 首先题目告诉我们,一次只能删去一个石子.当然有翻译时会注意,但是看英文题时总是容易忽略.. 先排序. 然后,你会发现,有些情况是一开始就输的,具体情况如下: 有两个 两个相等非零数.(a[x] ...
随机推荐
- java实现读取excel文件内容
package excel; import java.io.FileInputStream; import java.io.InputStream; import java.text.SimpleDa ...
- 栈面板类StackPane?
创建栈面板,将在其上放置两个按钮,并用样式属性设置按钮和栈面板的外观样式. package yuan; //栈面板的应用 import javafx.application.Application; ...
- python-scrapy爬取某招聘网站(二)
首先要准备python3+scrapy+pycharm 一.首先让我们了解一下网站 拉勾网https://www.lagou.com/ 和Boss直聘类似的网址设计方式,与智联招聘不同,它采用普通的页 ...
- Putty或MobaXTerm无法连接VMware虚拟机 报Network error: Connection timed out的解决方案
当出现无法连接的问题时, 我们要先对可能出现的问题进行梳理, 然后进行排查, 以下我先整理一些可能出现问题的地方: 1. 通过 ping 查看两台终端是否均有联网 windows下通过控制台 cmd ...
- golang语法笔记
开始微服务,那就先温习下golang语法吧; golang变量类型 1. 整形 Go %b 表示为二进制 %c 该值对应的unicode码值 %d 表示为十进制 %o 表示为八 ...
- Spring Boot 2.x基础教程:多个文件的上传
昨天,我们介绍了如何在Spring Boot中实现文件的上传.有读者问:那么如果有多个文件要同时上传呢?这就马上奉上,当碰到多个文件要同时上传的处理方法. 动手试试 本文的动手环节将基于Spring ...
- 多年经验总结,写出最惊艳的 Markdown 高级用法
点赞再看,养成习惯,微信搜索[高级前端进阶]关注我. 本文 GitHub https://github.com/yygmind 已收录,有一线大厂面试完整考点和系列文章,欢迎 Star. 最近在学习的 ...
- dbms_job和dbms_job基础学习
一.dbms_job学习 a.创建job: dbms_job.submit(jobno,what,next_date,interval);b.删除job: dbms_job.remove(jobno) ...
- 【分布式锁的演化】终章!手撸ZK分布式锁!
前言 这应该是分布式锁演化的最后一个章节了,相信很多小伙伴们看完这个章节之后在应对高并发的情况下,如何保证线程安全心里肯定也会有谱了.在实际的项目中也可以参考一下老猫的github上的例子,当然代码没 ...
- CICD基础概念
windows下搭建jenkins:安装方法一:1.安装JDK,配置好环境变量2.下载安装最新版本Jenkins:登陆 http://mirrors.jenkins-ci.org/ 下载windows ...