博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1115: [POI2009]石子游戏Kam(博弈)
阅读量:2143 次
发布时间:2019-04-30

本文共 904 字,大约阅读时间需要 3 分钟。

Time Limit: 10 Sec  
Memory Limit: 162 MB
Submit: 1132  
Solved: 692
[ ][ ][ ]

Description

有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏。问先手是否必胜。

Input

第一行u表示数据组数。对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=……<=an)。 1<=u<=10 1<=n<=1000 0<=ai<=10000

Output

u行,若先手必胜输出TAK,否则输出NIE。

Sample Input

2
2
2 2
3
1 2 4

Sample Output

NIE
TAK

将相邻两堆石子做差。就可以将题目转化为:

有n堆石子,从右到左编号1到n

每次可以从一堆石子中将任意多石子移动到右边那堆,对于第1堆石子就直接取走,取完者胜

很显然对于编号为偶数的堆,先手不主动去移动,只要后手去移动它,那么先手只要照搬他的动作即可,这样到最后一定是先手把这些石子直接取走

对于编号为奇数的堆,因为只要移动一次就将石子移动到编号为偶数的堆上了,所以相当于就是直接取走

这样思路就明显了,将编号为奇数堆的石子异或起来,为0就是先手必败,否则先手必胜

#include
int a[1005];int main(void){ int T, n, i, ans; scanf("%d", &T); while(T--) { scanf("%d", &n); for(i=1;i<=n;i++) scanf("%d", &a[i]); for(i=n;i>=1;i--) a[i] = a[i]-a[i-1]; ans = 0; for(i=n;i>=1;i-=2) ans ^= a[i]; if(ans) printf("TAK\n"); else printf("NIE\n"); } return 0;}

转载地址:http://lqmgf.baihongyu.com/

你可能感兴趣的文章
solver及其配置
查看>>
JAVA多线程之volatile 与 synchronized 的比较
查看>>
Java集合框架知识梳理
查看>>
笔试题(一)—— java基础
查看>>
Redis学习笔记(三)—— 使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题
查看>>
Intellij IDEA使用(一)—— 安装Intellij IDEA(ideaIU-2017.2.3)并完成Intellij IDEA的简单配置
查看>>
Intellij IDEA使用(二)—— 在Intellij IDEA中配置JDK(SDK)
查看>>
Intellij IDEA使用(三)——在Intellij IDEA中配置Tomcat服务器
查看>>
Intellij IDEA使用(四)—— 使用Intellij IDEA创建静态的web(HTML)项目
查看>>
Intellij IDEA使用(五)—— Intellij IDEA在使用中的一些其他常用功能或常用配置收集
查看>>
Intellij IDEA使用(六)—— 使用Intellij IDEA创建Java项目并配置jar包
查看>>
Eclipse使用(十)—— 使用Eclipse创建简单的Maven Java项目
查看>>
Eclipse使用(十一)—— 使用Eclipse创建简单的Maven JavaWeb项目
查看>>
Intellij IDEA使用(十三)—— 在Intellij IDEA中配置Maven
查看>>
面试题 —— 关于main方法的十个面试题
查看>>
集成测试(一)—— 使用PHP页面请求Spring项目的Java接口数据
查看>>
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
Redis学习笔记(四)—— redis的常用命令和五大数据类型的简单使用
查看>>
Win10+VS2015编译libcurl
查看>>