题目 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. 输入格式 第一行u表示数据组数.对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=--<=an). 1<=u<=10 1<=n<=1000 0<=ai<=10000 输出格式 u行,若先手必胜输出TAK,否则输出N…
石子游戏 Kam bzoj-1115 POI-2009 题目大意:给定n堆石子,两个人轮流取石子.每堆石子的个数都不少于前一堆石子.每次取后也必须维持这个性质.问谁有必胜策略. 注释:$1\le cases\le 10$,$1\le n\le 1000$. 想法:我们发现,每一次取石子的个数收到限制.但是取了一堆的石子,后面那堆的石子可以取得个数就会变多. 所以我们考虑相邻两堆石子做差,就变成了经典的阶梯博弈. 阶梯博弈的结论:总SG值等于奇数阶梯的SG的异或和. 最后,附上丑陋的代码... .…
有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. 首先直接考虑题中的条件并没有办法入手 每堆石子的个数不少于前一堆石子的个数可以看成是相邻两堆石子时间的个数差保持>=0 于是可以把这些石子差看做石子 每次操作会将其中一堆石子减去一个值,又会将它后面的一堆加上相等的值 就可以看做是把这一堆推到它后面的一堆 于是转化成了阶梯博弈 阶梯博弈 描述大概就是:…
1115: [POI2009]石子游戏Kam Time Limit: 10 Sec  Memory Limit: 162 MB Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. Input 第一行u表示数据组数.对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=……<=an). 1…
题目描述 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. 输入 第一行u表示数据组数.对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=……<=an). 1<=u<=10 1<=n<=1000 0<=ai<=10000 输出 u行,若先手必胜输出TAK,否则输出NIE…
Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. Input 第一行u表示数据组数.对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=……<=an). 1<=u<=10 1<=n<=1000 0<=ai<=10000 Output u行,若先手必…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1115 [题目大意] 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数. 两人轮流操作每次操作可以从一堆石子中移走任意多石子, 但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. [题解] 我们定义最后一堆以及下标与其相差为偶数的堆为偶堆石子,其余的为奇堆石子, 我们发现不管奇堆石子做什么操作,只要在偶堆石子中做相应的操作就可以抵消, 因此决定…
挺水的 听说是阶梯nim和,就去看了一下,然后就会了= = 观察题目,发现拿第i堆棋子k个造成的影响就是第i+1堆棋子能多拿k个 可以把模型转化为,有n堆石子,每次从某一堆拿一个石子,放在下一堆中,不能拿的输 就是阶梯nim和了= = 然后就乱写了= = CODE: #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; in…
差分后与阶梯博弈很类似. #include<cstdio> using namespace std; int n,T,a[1001],ans; int main() { scanf("%d",&T); for(;T;--T) { ans=0; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); for(int i=n;i>=1;i-=2)…
题目链接:BZOJ - 1115 题目分析 首先看一下阶梯博弈: 阶梯博弈是指:初始有 n 堆石子,每次可以从任意的第 i 堆拿若干石子放到第 i - 1 堆.最终不能操作的人失败. 解法:将奇数位的石子堆做最基本的 NIM 就可以了. WHY:对奇数位做 NIM 的必胜者总是可以胜利,因为如果从奇数位拿石子到偶数位,就相当于把这些石子拿走了,就是 NIM :如果必败者从偶数位将石子拿到奇数位,必胜者总是可以将这些石子再向前移一个位置,就又放到了偶数位,这样一直移动的话,最终会是必胜者将这些石子…