Sequential Nim(CodeForces - 1382B)【博弈】
时间:2022-07-26
本文章向大家介绍Sequential Nim(CodeForces - 1382B)【博弈】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
B - Sequential Nim (CodeForces - 1382B)
算法
博弈
时间复杂度O(N)
1.这道题乍一看以为用Nim博弈直接套用就可以了,结果通过题意发现并不是。题目中要求取石子时只能从下标最小的那一堆开始取,也就是说一堆一堆的取,不能跳着取。
2.分析完题意,我们知道最后取完最后一堆的人必胜。那么怎么分析谁最后会赢呢?
如果只有一堆的话,很容易得出第一个人获胜。关键在于如何分析多堆的情况。
为了方便,我们将每一堆中首先取的人称为先手,然后取的人是后手,下面我们来进行分类讨论:
- 如果某一堆只有1个石子,那么先手只能取这一个石子。如果还有剩余的石堆,那么此先手在下一堆中将成为后手(因为两个人是轮流取的);如果没有剩余的石堆,那么此先手获胜。
- 如果某一堆中有若干个石子(超过1个),为了最优,先手有两种取法,要么全取完,要么取走大部分,只剩余一个。前者会使得先手在下一堆中充当后手,后者会使先手在下一堆中充当先手。当然如果没有下一堆了,取完即可,这时先手赢。否则还要继续判断。
分类讨论后发现,一共就上面两大类情况。那么该怎么做呢?这里是题目的一个难点。
对于先手,当该石堆中石子个数超过1并且还有其他的石堆时,他可以根据实际情况选择在下一堆中成为先手还是后手。但是当石堆中石子个数为1时他别无选择,只能是在下一堆中成为后手。所以说石子个数为1的石堆为转折点。
既然当某石堆石子个数大于1时先手可以任意选择在下一堆中他的身份,所以如果还有其他石堆,那么该先手必胜。(因为他掌握着主动权,所以他完全可以根据剩余的石堆数来选择接下来的身份,至于怎么选我们不用考虑)
当石子个数等于1时,先手变成后手,后手变成先手。
3.总结一下,我们只需从头判断每一堆的石子的个数,若个数为1,则继续循环,直到循环完。如果循环完了,说明都为1,这时只需判断石堆个数即可;若出现个数不为1的,则先手必胜,跳出循环即可。
C++代码
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int t, n;
int a[N];
int main()
{
cin >> t;
while(t--)
{
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];
int first = 1, second = 0;
bool flag = false;
for(int i = 0; i < n; i++)
{
if(a[i] == 1)
{
if(first)
{
first = 0;
second = 1;
}
else
{
first = 1;
second = 0;
}
}
else
{
if(first)
puts("First");
else
puts("Second");
flag = true;
break;
}
}
if(!flag)
{
if(n % 2 == 1) puts("First");
else puts("Second");
}
}
}
思路来源(注意这里“先手”的定义与思路来源连接里的“先手"定义不同)
- Tensorflow动态seq2seq使用总结
- 卷积神经网络中PET/CT图像的纹理特征提取
- 深入剖析Spring(四)——AOP
- Java并发编程的艺术(十二)——线程安全
- 用 LSTM 做时间序列预测的一个小例子
- Java并发编程的艺术(十一)——线程池(2)
- Java并发编程的艺术(十)——线程池(1)
- Tensorflow on Spark爬坑指南
- Boost asio 官方教程
- 0基础教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)
- 柴毛毛大话设计模式——开发常用的设计模式梳理
- Redis源码分析(四)——Redis数据结构-整数集合
- Redis源码分析(三)——Redis数据结构-字典
- Redis源码分析(二)——Redis数据结构-链表
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Oracle 数据库impdp导入数据库版本和dmp数据库文件版本不匹配问题解决方法,ORA-39142版本号不兼容、ORA-39000转储文件说明错误解决方法
- 实践总结:基于Kbone使用React同构开发小程序
- BAT 批处理命令 - 实现输出当前文件夹下的所有文件夹名的功能实例演示
- Python+Selenium 自动化-指定chrome驱动运行selenium实例演示,运行指定位置下的浏览器驱动
- Linux 命令查找指定文件夹下符合查询条件的文件和文件夹实例演示
- 用Python实现一个最新QQ办公版(TIM)的登录界面
- Oracle 数据库直接执行本地sql文件、sql脚本实例演示
- Oracle 数据库利用回收站恢复删除的表实例演示
- Linux 命令利用scp实现从服务器共享地址上传下载文件、文件夹实例演示,scp命令的参数详解
- Oracle 数据库利用sql语句判断某个表是否是临时表实例演示,达梦数据库查询出所有临时表
- JavaScript 技术篇-一段js代码展示可以随鼠标移动变换样式的卡通人物,动态女生眼睛跟着鼠转动
- PyQt5 图形界面-用Qt Designer来设计UI界面,并转化为python代码运行
- Python 技术篇-python生成html源码功能实现演示,html代码自动生成技巧。列表生成式的灵活应用。
- Python 技术篇-pyHook键盘鼠标监听事件,监测鼠标键盘按键。超简单,几行代码搞定。
- Python 技术篇-用mutagen库提取MP3歌曲图片