codeforces 768 E Game of Stones(博弈)
2017-02-21 11:17
465 查看
题意:
算是nim的变形题吧
给n堆石子,在一堆石头上取的石头数量只能去一次,比如你在一堆石子上取了了4个石子,那么接下里你就不能在这堆石子上取4个石子了.问后手是否必胜.
解题思路:
如果没有最后那个条件,那就是普通的nim,我们去求每堆石子的数量的亦或和即可.
但是这里明显是不行的.考虑到nim中石子数量其实就是最多能取石子的步数,最后的亦或和也就是最大步数的亦或和,我们可以去求下这个游戏中每堆石子最多能取的步数,这样就能转换为普通的nim了.每堆石子最多能取的步数就好好求了,每堆石子我们按1,2,3,4..n的顺序去取石子,当剩下的石子小于等于n的时候,就不能再取了,所以n就是最大步数,然后我们去求下亦或和就可以.亦或和非0的话,先生必胜,即后手必败,亦或和0反之.
代码:
算是nim的变形题吧
给n堆石子,在一堆石头上取的石头数量只能去一次,比如你在一堆石子上取了了4个石子,那么接下里你就不能在这堆石子上取4个石子了.问后手是否必胜.
解题思路:
如果没有最后那个条件,那就是普通的nim,我们去求每堆石子的数量的亦或和即可.
但是这里明显是不行的.考虑到nim中石子数量其实就是最多能取石子的步数,最后的亦或和也就是最大步数的亦或和,我们可以去求下这个游戏中每堆石子最多能取的步数,这样就能转换为普通的nim了.每堆石子最多能取的步数就好好求了,每堆石子我们按1,2,3,4..n的顺序去取石子,当剩下的石子小于等于n的时候,就不能再取了,所以n就是最大步数,然后我们去求下亦或和就可以.亦或和非0的话,先生必胜,即后手必败,亦或和0反之.
代码:
#include <bits/stdc++.h> using namespace std; const int maxn=1e6+5; int a[maxn]; int main() { int n; int i, x, j, sum, ans; cin>>n; for(i=0; i<n; i++) { scanf("%d", &x); for(j=1, sum=0; j<=60; j++) { x-=j; if(x<=j)break; } a[i]=j;//最大步数 ans=i==0?a[i]:ans^a[i]; } if(ans)printf("NO"); else printf("YES"); }
相关文章推荐
- Codeforces 768 E. Game of Stones 博弈DP
- codeforces 399 E. Game of Stones 博弈 思维题
- Codeforces Round #399 E Game of Stones 博弈
- Codeforces Round #399 (Div. 1 + Div. 2, combined) (博弈,Nim游戏)E.Game of Stones
- 2016 ICPC 大连 C Game of Taking Stones 【威佐夫博弈+大数+高精度】
- ZOJ 3964 Yet Another Game of Stones (博弈)
- Codeforces Round #399 E Game of Stones 博弈
- Game of Taking Stones (hdu5973)——2016大连现场赛C题 威佐夫博弈
- ZOJ 3964 Yet Another Game of Stones (博弈)
- Codeforces Round #399 E Game of Stones 博弈
- Codeforces Round #399 E Game of Stones 博弈
- Codeforces Round #399 E Game of Stones 博弈
- Yet Another Game of Stones ZOJ - 3964 (博弈)
- Codeforces Round #399 E Game of Stones 博弈
- Codeforces Round #399 E Game of Stones 博弈
- Codeforces 549C. The Game Of Parity 博弈
- Codeforces Round #399 E Game of Stones 博弈
- Codeforces Round #399 E Game of Stones 博弈
- Codeforces Round #399 E Game of Stones 博弈
- codeforces 549C C. The Game Of Parity(博弈)