BZOJ1115 [POI2009]石子游戏Kam 【博弈论——阶梯游戏】
题目
有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏。问先手是否必胜。
输入格式
第一行u表示数据组数。对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=……<=an)。 1<=u<=10 1<=n<=1000 0<=ai<=10000
输出格式
u行,若先手必胜输出TAK,否则输出NIE。
输入样例
2
2
2 2
3
1 2 4
输出样例
NIE
TAK
题解
首先我们了解一下阶梯游戏:
有一个n级的阶梯,每级阶梯上有若干硬币。二人轮流操作,每次可以将某一级台阶上的若干个硬币移到下一级。无法操作者输
这是一个SG游戏,我们尝试把它转化为Nim游戏来求解
经分析可以发现这个游戏只与奇数阶有关: 
①假若对手移动偶数阶,我们可以继续将其往下移动到偶数阶,直至0阶 
②假若对手移动奇数阶,若移动第一阶,则相当于取走 
③假若对手移动奇数阶,且将移动到偶数阶,而偶数阶的子最终将以①的方式到达0阶而不改变先后手,所以也相当于取走
至此,可以完全转化为只与奇数阶有关的Nim游戏,求奇数阶异或和,非0则必胜
本题
本题和阶梯游戏有什么关系呢? 
由于石子数单调不减,每堆石子之间有个差值 
当我们移走第i堆的x个石子时,i与i - 1的差值减少x,i+1与i的差值增加x,不就是阶梯游戏么? 
注意:这里N与N-1的差值是第一级台阶,相当于反过来的阶梯游戏
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u]; k != -1; k = ed[k].nxt)
using namespace std;
const int maxn = 1005,maxm = 100005,INF = 1000000000;
inline int RD(){
    int out = 0,flag = 1; char c = getchar();
    while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
    while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
    return out * flag;
}
int A[maxn],N;
int main(){
    int T = RD();
    while (T--){
        N = RD(); int x = 0;
        REP(i,N) A[i] = RD();
        for (int i = N; i > 0; i--) A[i] -= A[i - 1];
        for (int i = N; i > 0; i -= 2) x ^= A[i];
        if (x) puts("TAK");
        else puts("NIE");
    }
    return 0;
}
BZOJ1115 [POI2009]石子游戏Kam 【博弈论——阶梯游戏】的更多相关文章
- [bzoj1115][POI2009]石子游戏Kam_博弈论_阶梯博弈
		石子游戏 Kam bzoj-1115 POI-2009 题目大意:给定n堆石子,两个人轮流取石子.每堆石子的个数都不少于前一堆石子.每次取后也必须维持这个性质.问谁有必胜策略. 注释:$1\le ca ... 
- [BZOJ1115][POI2009]石子游戏Kam解题报告|阶梯博弈
		有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. 首先 ... 
- bzoj 1115: [POI2009]石子游戏Kam  -- 博弈论
		1115: [POI2009]石子游戏Kam Time Limit: 10 Sec Memory Limit: 162 MB Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前 ... 
- BZOJ1115[POI2009]石子游戏——阶梯Nim游戏
		题目描述 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必 ... 
- bzoj1115: [POI2009]石子游戏Kam
		Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏 ... 
- BZOJ 1115 [POI2009]石子游戏Kam(阶梯博弈)
		[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1115 [题目大意] 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数. ... 
- BZOJ1115:[POI2009]石子游戏Kam(博弈论)
		挺水的 听说是阶梯nim和,就去看了一下,然后就会了= = 观察题目,发现拿第i堆棋子k个造成的影响就是第i+1堆棋子能多拿k个 可以把模型转化为,有n堆石子,每次从某一堆拿一个石子,放在下一堆中,不 ... 
- 【博弈论】bzoj1115 [POI2009]石子游戏Kam
		差分后与阶梯博弈很类似. #include<cstdio> using namespace std; int n,T,a[1001],ans; int main() { scanf(&qu ... 
- [BZOJ 1115] [POI2009] 石子游戏Kam 【阶梯博弈】
		题目链接:BZOJ - 1115 题目分析 首先看一下阶梯博弈: 阶梯博弈是指:初始有 n 堆石子,每次可以从任意的第 i 堆拿若干石子放到第 i - 1 堆.最终不能操作的人失败. 解法:将奇数位的 ... 
随机推荐
- Linux Shell常用命令(长期更新)
			#判断某个字段是否匹配指定值 awk -F"," '{if($4=="value"){print $1} else {print $0}}' file.txt ... 
- Hive初识(四)
			Hive本质上是一个数据仓库,但不存储数据(只存储元数据(metadata),Hive中的元数据包括表的名字,表的列和分区及分区及其属性,表的属性(是否为外部表等),表的数据所在目录等),用户可以借助 ... 
- python爬虫之有道在线翻译
			今天初学了python这门课 老师简单的讲解了一下 python的安装环境,配置环境变量,当前主流Python使用的是3.x版本, 下午简单的讲解了python的起源,发展以及在各个方面的应用 然后晚 ... 
- Spring配置文件一直报错的根源所在
			跳坑后的感悟总结 Spring在配置文件中经常会报XML错误,以下是几种常见的解决办法 方式一:打开eclipse-->Project-->Clean ;清除一下 方式二:查看xml配置文 ... 
- Centos7下lamp环境搭建的小笔记
			刚刚把校赛弄完,赛前在环境搭建上花了蛮多时间,也正好记一下笔记 0.首先更新源 清华大学开源镜像站的源 https://mirrors.tuna.tsinghua.edu.cn/help/centos ... 
- c/c++指针理解
			指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占 ... 
- 2 web服务器:固定返回值
			1.老师给的思路 #tcp socket 服务端 socket = socket.socket() socket.bind() socket.listen() client_socket = sock ... 
- Java:详解内部类
			可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ... 
- Hibernate-ORM:12.Hibernate中的多对多关联关系
			------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客将讲述Hibernate中的多对多关联关系的操作,准备的篇幅较少,望海涵 一,讲述多对多 多对多的关联 ... 
- PHP批量替换MySql数据库中的数据内容
			<?php //替换数据库内容类 class replace{ public $dbAddress; //数据库地址 public $dbUser; //数据库用户名 public $dbPwd ... 
