sgu153:Playing with matches
2014-12-03 19:06
260 查看
题意:
一个取火柴游戏,可以取的数在一个集合S内,S必包含1,且不超过9个数,每个数都不大于9.最后取完者失败。
求n(n<10^9)根火柴时先取的胜利还是后取的胜利.
分析:
貌似有一种dp方程f[i]=max(f[i-P[j]]^1)
然后打个表貌似还有规律吧,而且规律好像也不长额,所以暴力找一下就好啦...
一个取火柴游戏,可以取的数在一个集合S内,S必包含1,且不超过9个数,每个数都不大于9.最后取完者失败。
求n(n<10^9)根火柴时先取的胜利还是后取的胜利.
分析:
貌似有一种dp方程f[i]=max(f[i-P[j]]^1)
然后打个表貌似还有规律吧,而且规律好像也不长额,所以暴力找一下就好啦...
#include <cstdio> #include <cstring> using namespace std; const int MAXM = 10, MAXP = 505; int N, M, P[MAXM], r; bool f[MAXP], cap[MAXP]; int main() { int K; scanf("%d", &K); while(K--) { memset(P, 0, sizeof(P)); memset(f, 0, sizeof(f)); memset(cap, 0, sizeof(cap)); scanf("%d%d", &N, &M); P[1] = 1; M++; for(int i = 2; i <= M; ++i) scanf("%d", P+i); cap[0] = true;f[0] = true; for(int i = 1; i < 40; ++i) for(int j = 1; j <= M; ++j) if(i-P[j] >= 0 && cap[i-P[j]]) f[i] |= f[i-P[j]]^1, cap[i] = true; r = 0; for(int i = 18; i >= 1 && !r; --i) for(int j = 0; j < i; ++j) { if(f[j] != f[j+i]) break; if(j == i-1) r = i; } if(f[N%r]) puts("FIRST PLAYER MUST WIN"); else puts("SECOND PLAYER MUST WIN"); } return 0; }
相关文章推荐
- SGU 153 Playing with matches (博弈,循环节)
- sgu153 Playing with matches (博弈dp)#by nobody
- sgu 153 Playing with matches
- SGU 153 - Playing with matches(博弈)
- sgu153: Playing with matches
- 玩转指针(Playing with Pointers)
- Playing with Paper -CodeForces - 527A
- eoj1854 Playing With Cubes 二分图最大匹配
- Playing with Numbers Kattis - playingwithnumbers GCD LCM
- Tutorial:Playing With Ext The Easy Way(蹒跚学步)
- Playing Around with Methods Overloading, C-language and Operators (1)
- UVALive 5059 C Playing With Stones
- UVALive 5059 C - Playing With Stones 博弈论Sg函数
- A. Playing with Paper
- unit test use EasyMock:Possible matches are marked with (+1):
- hdu 2462 poj 3696 The Luckiest number fzu 1017 zoj 1537 Playing with Calculator
- Playing with ptrace, Part II
- Playing with huge information streams: Twitter Storm!
- EOJ 1864 Playing With Cubes
- No resource found that matches the given name (at 'layout_above' with value '@id/butt