poj 2960 S-Nim(SG函数)
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 3694 | Accepted: 1936 |
Description
- 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
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
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 5
3
2 5 12
3 2 4 7
4 2 3 7 12
5 1 2 3 4 5
3
2 5 12
3 2 4 7
4 2 3 7 12
0
Sample Output
LWW
WWL
Source
【思路】
SG函数。
裸ti ,注意下sg和vis的大小就好了 :)
【代码】
#include<cstdio>
#include<cstring>
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
using namespace std; int n,m,a[],sg[]; int dfs(int x) {
if(sg[x]!=-) return sg[x];
if(!x) return sg[x]=;
int vis[]; //size of [si]
memset(vis,,sizeof(vis));
FOR(i,,n)
if(x>=a[i]) vis[dfs(x-a[i])]=;
for(int i=;;i++)
if(!vis[i]) return sg[x]=i;
} int main() {
while(scanf("%d",&n)== && n) {
FOR(i,,n) scanf("%d",&a[i]);
scanf("%d",&m);
memset(sg,-,sizeof(sg));
FOR(i,,m) {
int x,v,ans=;
scanf("%d",&x);
FOR(j,,x)
scanf("%d",&v) , ans^=dfs(v);
if(ans) printf("W");
else printf("L");
}
putchar('\n');
}
return ;
}
poj 2960 S-Nim(SG函数)的更多相关文章
- POJ 2960 S-Nim 博弈论 sg函数
http://poj.org/problem?id=2960 sg函数几乎是模板题. 调试代码的最大障碍仍然是手残在循环里打错变量名,是时候换个hydra产的机械臂了[超想要.jpg] #includ ...
- HDU3544 Alice's Game && POJ 2960 S-Nim(SG函数)
题意: 有一块xi*Yi的矩形巧克力,Alice只允许垂直分割巧克力,Bob只允许水平分割巧克力.具体来说,对于Alice,一块巧克力X i * Y i,只能分解成a * Y i和b * Y i其中a ...
- poj 2960 S-Nim【SG函数】
预处理出SG函数,然后像普通nim一样做即可 #include<iostream> #include<cstdio> using namespace std; const in ...
- hdu 3032 Nim or not Nim? sg函数 难度:0
Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 多校6 1003 HDU5795 A Simple Nim (sg函数)
思路:直接打表找sg函数的值,找规律,没有什么技巧 还想了很久的,把数当二进制看,再类讨二进制中1的个数是必胜或者必败状态.... 打表: // #pragma comment(linker, &qu ...
- S-Nim POJ - 2960 Nim + SG函数
Code: #include<cstdio> #include<algorithm> #include<string> #include<cstring> ...
- HDU 3032 Nim or not Nim (sg函数)
加强版的NIM游戏,多了一个操作,可以将一堆石子分成两堆非空的. 数据范围太大,打出sg表后找规律. # include <cstdio> # include <cstring> ...
- hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)
Nim or not Nim? Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
- HDU 1729 Stone Game 石头游戏 (Nim, sg函数)
题意: 有n个盒子,每个盒子可以放一定量的石头,盒子中可能已经有了部分石头.假设石头无限,每次可以往任意一个盒子中放石头,可以加的数量不得超过该盒中已有石头数量的平方k^2,即至少放1个,至多放k^2 ...
随机推荐
- Andriod ADT v22.6.2版本中在Mainactivity.java中使用fragment_main.xml中TextView控件对象的问题
众所周知,我们既可以在 activity_main.xml文件中控制activity中的view,也可以使用java代码的set..()方法控制它.在学习过程中,发现在ADT新版本中,和以前版本有区别 ...
- Page.ClientScript.RegisterStartupScript不执行问题
c#后台使用Page.ClientScript.RegisterStartupScript在前台注册一段脚本提示,发现没有效果,寻寻觅觅,终于从度娘处找到了原因: 该页面多次使用到了Page.Clie ...
- JS DOM 来控制HTML元素
JS DOM 来控制HTML元素 (ps:这个有很多方法,挑一些详解,嘻嘻) 1.getElementsByName():获取name. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...
- vertical-align的深入学习
W3C官方对vertical-align属性的定义有4个方面: (1)vertical-align属性用于定义“周围的文字.inline元素以及inline-block元素”相对于该元素基线的垂 ...
- 在本地Apache服务器配置虚拟主机站点
Apache 配置localhost虚拟主机步骤1,打开apache目录下httpd.conf文件,找到如下模块 # Virtual hosts #Include conf ...
- 怎样让老浏览器兼容html5新标签
CSS样式设置默认样式: <style> article, aside, canvas, details, figcaption, figure, footer, header, hgro ...
- php批量发送短信或邮件的方案
最近遇到在开发中遇到一个场景,后台管理员批量审核用户时候,需要给用户发送审核通过信息,有人可能会想到用foreach循环发送,一般的短信接口都有调用频率,循环发送,肯定会导致部分信息发送失败,有人说用 ...
- 知识管理(knowledge Management)2
①找到生命的主轴 ②跨领域知识管理
- 【转】mysqldump
原文地址:http://blog.chinaunix.net/uid-16844903-id-3411118.html 导出 导出全库备份到本地的目录 mysqldump -u$USER -p$PAS ...
- iOS: 学习笔记, Swift与C指针交互(译)
Swift与C指针交互 Objective-C和C API经常需要使用指针. 在设计上, Swift数据类型可以自然的与基于指针的Cocoa API一起工作, Swift自动处理几种常用的指针参数. ...