博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P3480 [POI2009]KAM-Pebbles 阶梯NIM
阅读量:4992 次
发布时间:2019-06-12

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

$ \color{#0066ff}{ 题目描述 }$

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

\(\color{#0066ff}{输入格式}\)

多组输入,第一行一个整数u代表数据组数(1<=u<=10)

接下来共2*u行,每两行代表一组数据:

第一行只有一个整数n(1<=n<=1000),表示石子堆数;

第二行有n个整数用空格隔开,第i个整数ai表示第i堆的石子个数,保证a1<=a2<=a3...<=an。

对于每组数据,保证石子总数不超过10000。

\(\color{#0066ff}{输出格式}\)

输出u行,如果第i组数据先手必胜,输出“TAK”,否则输出“NIE”。

\(\color{#0066ff}{输入样例}\)

222 231 2 4

\(\color{#0066ff}{输出样例}\)

NIETAK

\(\color{#0066ff}{数据范围与提示}\)

none

\(\color{#0066ff}{题解}\)

考虑每一堆石子能拿多少,就是\(a[i]-a[i-1]\),差分数组

如果在i堆拿了x个石子,那么相当于i堆可拿石子数-x,i+1堆可拿石子数+x

也就是说从i堆向i+1堆拿了x个石子,这是反着的阶梯NIM!!!

#include
#define LL long longLL in() { char ch; LL x = 0, f = 1; while(!isdigit(ch = getchar()))(ch == '-') && (f = -f); for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48)); return x * f;}int a[1005050];int main() { for(int T = in(); T --> 0;) { int n = in(); int ans = 0; for(int i = 1; i <= n; i++) a[i] = in(); for(int i = n; i >= 1; i--) a[i] -= a[i - 1]; //注意要反着求 for(int i = n; i >= 1; i -= 2) ans ^= a[i]; printf(ans? "TAK\n" : "NIE\n"); } return 0;}

转载于:https://www.cnblogs.com/olinr/p/10482990.html

你可能感兴趣的文章
第四章 数据类型
查看>>
php-cgi.exe
查看>>
5.7 Windows常用网络命令
查看>>
js跨域问题新方案
查看>>
第六次作业
查看>>
HTML5 Video/Audio播放本地文件
查看>>
svn报错:“Previous operation has not finished; run 'cleanup' if it was interrupted“ 的解决方法...
查看>>
SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction 解决方法...
查看>>
VB.Net制作-历朝通俗演义
查看>>
TreeviewEditor.rar
查看>>
关于TP 特殊页面伪静态规则的编写 研究实现
查看>>
codeforces 350 div2 C. Cinema map标记
查看>>
跟我一起写 Makefile(十二)
查看>>
bzoj 1925: [Sdoi2010]地精部落
查看>>
模仿支付宝banner平铺浏览器设计效果(自由创建按钮序列)
查看>>
spring 和spring cloud 组成
查看>>
第二冲刺站立会议01
查看>>
C++ const
查看>>
Windows Tips
查看>>
Spring中使用RedisTemplate操作Redis(spring-data-redis)
查看>>