[ACM] hdu 1536 S-Nim(Nim组合博弈 SG函数打表)
来源:互联网 发布:windows7装ubuntu系统 编辑:程序博客网 时间:2024/06/07 02:17
S-Nim
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4004 Accepted Submission(s): 1732Problem Description
Arthur and his sister Caroll have been playing a game called Nim for some time now. Nim is played as follows: The starting position has a number of heaps, all containing some, not necessarily equal, number of beads. The players take turns chosing a heap and removing a positive number of beads from it. The first player not able to make a move, loses.Arthur and Caroll really enjoyed playing this simple game until they recently learned an easy way to always be able to find the best move: Xor the number of beads in the heaps in the current position (i.e. if we have 2, 4 and 7 the xor-sum will be 1 as 2 xor 4 xor 7 = 1). If the xor-sum is 0, too bad, you will lose. Otherwise, move such that the xor-sum becomes 0. This is always possible.It is quite easy to convince oneself that this works. Consider these facts: The player that takes the last bead wins. After the winning player's last move the xor-sum will be 0. The xor-sum will change after every move.Which means that if you make sure that the xor-sum always is 0 when you have made your move, your opponent will never be able to win, and, thus, you will win. Understandibly it is no fun to play a game when both players know how to play perfectly (ignorance is bliss). Fourtunately, Arthur and Caroll soon came up with a similar game, S-Nim, that seemed to solve this problem. Each player is now only allowed to remove a number of beads in some predefined set S, e.g. if we have S =(2, 5) each player is only allowed to remove 2 or 5 beads. Now it is not always possible to make the xor-sum 0 and, thus, the strategy above is useless. Or is it? your job is to write a program that determines if a position of S-Nim is a losing or a winning position. A position is a winning position if there is at least one move to a losing position. A position is a losing position if there are no moves to a losing position. This means, as expected, that a position with no legal moves is a losing position.
Input
Input consists of a number of test cases. For each test case: The first line contains a number k (0 < k ≤ 100 describing the size of S, followed by k numbers si (0 < si ≤ 10000) describing S. The second line contains a number m (0 < m ≤ 100) describing the number of positions to evaluate. The next m lines each contain a number l (0 < l ≤ 100) describing the number of heaps and l numbers hi (0 ≤ hi ≤ 10000) describing the number of beads in the heaps. The last test case is followed by a 0 on a line of its own.
Output
For each position: If the described position is a winning position print a 'W'.If the described position is a losing position print an 'L'. Print a newline after each test case.
Sample Input
2 2 532 5 123 2 4 74 2 3 7 125 1 2 3 4 532 5 123 2 4 74 2 3 7 120
Sample Output
LWWWWL
解题思路:
这个题折腾了两三天,参考了两个模板,在这之间折腾过来折腾过去,终于把用法和需要注意的地方弄清楚了,汗。注意的是: bool类型的数组比int类型的数组快,不超时与超时的区别,在sg组合博弈时,只能在(a1,a2,a3,a4)中取,要特别注意这里面的数字是否是有序的,这个特别重要,下面贴出的两个模板对应了两种情况。最后,大数据输入还得用scanf。。
模板1(该模板注意的是一定要把 f 数组中的数字从小到大排序):
const int N=10008;//N为所有堆最多石子的数量int f[108],sg[N];//f[]用来保存只能拿多少个,sg[]来保存SG值bool hash[N];//mex{}void sg_solve(int t,int N)//t指f[]中的个数{ int i,j; memset(sg,0,sizeof(sg)); for(i=1;i<=N;i++) { memset(hash,0,sizeof(hash)); for(j=1;j<=t&&f[j]<=i;j++) { hash[sg[i-f[j]]]=1; } for(j=0;j<=N;j++) if(!hash[j]) break; sg[i] = j; }}模板2(该模板不需要进行排序)
const int N=10008;//N为所有堆最多石子的数量int f[108],sg[N];//f[]用来保存只能拿多少个,sg[]来保存SG值bool hash[N];//mex{}void sg_solve(int t,int N){ int i,j; memset(sg,0,sizeof(sg)); for(i=1;i<=N;i++) { memset(hash,0,sizeof(hash)); for(j=1;j<=t;j++) if(i - f[j] >= 0) hash[sg[i-f[j]]] = 1; for(j=0;j<=N;j++) if(!hash[j]) break; sg[i] = j; }}
代码(使用第二个模板)
#include <iostream>#include <algorithm>#include <stdio.h>#include <string.h>using namespace std;const int N=10008;//N为所有堆最多石子的数量int f[108],sg[N];//f[]用来保存只能拿多少个,sg[]来保存SG值bool hash[N];//mex{}void sg_solve(int t,int N){ int i,j; memset(sg,0,sizeof(sg)); for(i=1;i<=N;i++) { memset(hash,0,sizeof(hash)); for(j=1;j<=t;j++) if(i - f[j] >= 0) hash[sg[i-f[j]]] = 1; for(j=0;j<=N;j++) if(!hash[j]) break; sg[i] = j; }}int main(){ int k,m,l,num,i,j; while(scanf("%d",&k),k) { for(i=1;i<=k;i++) scanf("%d",&f[i]); sg_solve(k,N); scanf("%d",&m); string ans=""; for( i=1;i<=m;i++) { int sum=0; scanf("%d",&l); for( j=1;j<=l;j++) { scanf("%d",&num); sum^=sg[num]; } if(sum==0) ans+="L"; else ans+="W"; } cout<<ans<<endl; } return 0;}
1 0
- [ACM] hdu 1536 S-Nim(Nim组合博弈 SG函数打表)
- HDU 1536 S-Nim (博弈 sg函数 Nim和)
- HDU 1536 S-Nim [SG函数]【博弈】
- HDU 1536 S-Nim 博弈,SG函数
- hdu 1536、hdu 1944 S-Nim(博弈SG函数)
- HDU 1536(sg博弈) S-Nim
- HDU 1536 S-Nim(SG博弈)
- hdu 1536 &&hdu1944 S-Nim (sg函数打表)
- HDU 1536 && HDU 1944 S-Nim (Nim博弈、SG函数模板)
- HDU 1536 S-Nim SG函数 Nim
- HDU 2311-Nim or not Nim?(Nim博弈-打sg表找规律)
- HDU1536 S-Nim(博弈入门暴力打SG表)
- HDU 1536 S-Nim(sg函数)
- HDU 1536 S-Nim (SG函数)
- hdu 1536 S-Nim(SG函数)
- hdu 1536 S-Nim(SG函数)
- HDU 1536 S-Nim 博弈求sg函数
- 【HDU3032】【Lasker's Nim(一种Nim游戏)】Nim or not Nim? Multi-SG博弈、打表
- 实现左侧滑动菜单
- Ad-Hoc的用途 - iOS开发
- nginx学习文档持续不定期更新
- I/O 获取指定目录下的指定文件和目录
- PE 导出表
- [ACM] hdu 1536 S-Nim(Nim组合博弈 SG函数打表)
- 图解CELP模型的语意编码器
- MFC对话框最大化时控件也随比例最大化或者还原
- 实现左侧滑动菜单(二)
- [置顶] 毕业四年 .
- Android取证实战——书摘
- myeclipse添加server library
- Enusre Chained Methods are thread-safe
- [计算广告学]GFP, GSP and VCG
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
四时花开 某某宝
生活在明朝 某某宝
秀色田园 某某宝
致亲爱的某某某
你是谁的某某某是什么歌
某某某我想对你说作文
某某某我想对你说作文400字
by某某某什么意思中文
某某某主题曲
以后的以后你是谁的某某某
某的笔顺
靠笔顺
被笔顺
某加偏旁组成新字组词
某的组词
自 组词
某次数学竞赛共20道题
砂糖柑苗
无籽沃柑苗多少钱一棵
柑普
家庭自制柑普茶
柑普茶价格
侨宝柑普茶价格
柑普茶和小青柑的区别
柑普茶多少钱一斤
柑普茶品牌
柑普茶图片
柑普茶的功效
新会柑普茶
柑普茶怎么泡
柑普茶包装纸
柑普茶做法
柑普茶的做法
柑普茶的功效与作用
小青柑普茶有什么功效
普茶
柑桔树修剪留5一6个主干
中国柑橘网
柑桔潜叶蛾
柑桔品种
柑桔黑星病