小花梨的取石子游戏 ( 博弈 )
欢迎访问https://blog.csdn.net/lxt_Lucia~~
宇宙第一小仙女\(^o^)/~萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗~
--------------------------------我只是一条可爱哒分界线-------------------------------
一、问题:
Description
小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ?(如图)。
游戏将进行?轮,每轮游戏单独进行,互不干扰,每轮初始时第?堆石子数目为??。
第?轮从编号为?的那堆石子为起点,顺时针来取石子。两人轮流取石子,不可不取,最少取 一个石子,最多把当前这一堆取完,
只有取完一堆后才走到下一堆石子。走完一圈后石子都被取完,不能取石子的人就失败。
假设两人以最优策略进行取石子操作,请分别输出 ? 轮游戏是先手胜还是后手胜。
Input
第一行为正整数?,表示石子的堆数 (1 ≤ ? ≤ 100000)
第二行输入 ? 个正整数表示每一堆的石子数目?? (1 ≤ ?? ≤ 1e9 )
Output
输出 ? 行,第 ? 行表示第?轮游戏的结果。
如果先手胜则输出"?????",后手胜输出"??????"。
Sample Input
3
2 1 3
Sample Output
First
Second
First
Sample Input
2
2 2
Sample Output
First
First
二、题意:
中文题,不解释。注意是按顺序。
三、思路:
刚开始想用的尼姆博弈,后来发现是按顺序拿,不是任选一组。
多试几组样例会发现这样几个规律:
1)如果每轮第一堆不是1,那么先手必胜。假设第一堆是a [ i ] 个,那么先手可以通过拿a [ i ] - 1 个来获得主动权。
2)如果序列全为1,则取决于堆数,奇数则先手必胜,偶数则先手必败。这种情况需要单独考虑,不然就会先手后手相继输出。
3)此外就需要计算每轮从第一堆开始连续1的个数,偶数则先手必胜,奇数则先手必败。
其中,第(3)点找连续1的时候,如果是正常每次循环找的话会超时,所以就需要提前计算出来。
为了防止下标出错,我把原序列连着存了两遍,这样只需要找 [ i , i+n-1 ] 区间就可以了。
如果直接用sum数组从前往后遍历的话,记录的只能是开始到当前1的个数,所以倒着跑一遍,得到的才是正确答案。
四、代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define fori(a,b) for(int i=a;i<=b;i++)
#define forj(a,b) for(int j=a;j<=b;j++)using namespace std;
typedef long long ll;int main()
{int n, a[200020], sum[200020];bool flag = 0;mem(sum, 0);scanf("%d", &n);fori(1, n){scanf("%d", &a[i]);if(a[i] != 1)flag = 1;a[n+i] = a[i];}for(int i=n*2; i>=1; i--){if(a[i] == 1)sum[i] = sum[i+1]+1;elsesum[i] = 0;}fori(1, n){if(a[i] != 1){printf("First\n");continue;}else if(!flag){if(n % 2 == 1)printf("First\n");elseprintf("Second\n");}else{if(sum[i] % 2 == 0)printf("First\n");elseprintf("Second\n");}}return 0;
}
--------------------------------我也是有底线的---------------------------------
宇宙第一小仙女\(^o^)/~萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗~
小花梨的取石子游戏 ( 博弈 )相关推荐
- “美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**
"美登杯"上海市高校大学生程序设计邀请赛 (华东理工大学) D. 小花梨的取石子游戏 Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ? ...
- “美登杯”上海市高校大学生程序设计邀请赛(华东理工大学) 小花梨的取石子游戏(博弈)
Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ?(如图) . 游戏将进行?轮,每轮游戏单独进行,互不干扰,每轮初始时第?堆石子数目为??. 第?轮从编号为 ...
- poj 1067 取石子游戏(博弈+威佐夫博奕(Wythoff Game))
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 29959 Accepted: 9818 Descriptio ...
- BZOJ 1413: [ZJOI2009]取石子游戏 博弈+Dp
title BZOJ 1413 Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行, ...
- 威佐夫博弈:百练OJ:1067:取石子游戏
威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 百练OJ:1067:取石子游戏 ...
- POJ-1067取石子游戏,威佐夫博弈范例题/NYOJ-161,主要在于这个黄金公式~~
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取 ...
- 吴昊品游戏核心算法(新年特别篇)——另类取石子游戏(斐波那契博弈)
吴昊继续,我再也不想搬一堆石头放在这里了,取而代之的是<编程之美>中的关于游戏章节的一个插图,这本书中也有对<取石子游戏>的较为完备的讨论. 这次的游戏是神马? 1堆石子有n个 ...
- HDU2516 取石子游戏【博弈】
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- POJ1067 HDU1527 取石子游戏【博弈】
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
最新文章
- EFMVC - ASP.NET MVC 3 and Entity Framework 4.1 Code First 项目介绍
- java implements interface_Java 接口 interface implements
- 如何解决每次打开office 都会出现正在配置的问题
- Java黑皮书课后题第5章:5.2(重复加法)程序清单5-4产生了5个随机减法问题。改写该程序,使它产生10个随机加法问题,加数时两个1到15之间的整数。显示正确答案的个数和完成测试的时间
- Cocos2d 3.0继承自Sprite的类在addChild后出现故障
- java管道流文件的复制_JavaIO 总结笔记三 基本字节字符输入输出流和文件复制...
- (十)、java内部类与内部类的闭包和回调
- python post cookies_python 之post、get与cookie实战
- 软件测试行业前景,人才稀缺
- 64qam星座图matlab,基于MATLAB的QAM 眼图和星座图
- 【Linux 操作系统】vim编辑器配置及常用命令
- 美爆!《自然》公布2018年19张最震撼的科学图片
- TV新媒体电商发展遇瓶颈
- 鲁大师便捷查看硬盘参数
- 3台服务器+StarVCenter,搭建“超融合云平台”-完美体验-跑100台虚拟机
- 什么是高铁运营监测(转载)
- Flutter | bloc 之 state 使用优化
- bootstrap table合并单元格mergeCell
- CSS 实现DIV水平垂直居中(一)
- 华三交换机升级的ipe文件_H3C设备升级
热门文章
- 计算机系高考激励的句子,最新暖心激励高考生的励志句子40句
- 【计算方法】实验二:python实现高斯消去、列主元高斯消去,LU分解分别求解线性方程组
- 计算机专业助我成长作文600,电脑伴我成长作文
- Java数据类型及拓展面试题
- =,==和===的区别
- 摄影师拍蜗牛乘树叶花下避雨 似撑小伞泛舟
- 动画程序时长缩放是什么意思_1分钟做出高逼格动画!PPT中自带的小功能帮你一键搞定!...
- 立创eda学习笔记二十六:手把手教你使用立创eda的官方教程
- 斯坦福大学开发PETE装置吸收60%的太阳能
- 文本(文章内容)编辑器(CMS管理)