http://acm.hdu.edu.cn/showproblem.php?pid=1536

http://acm.hdu.edu.cn/showproblem.php?pid=1944

一样的题

题意:先给一个集合,代表可能发生的转移。然后m个询问,可以理解为每次给l堆石子,每堆有hi个,问博弈策略

直接用sg定理,非常简单,转移给的清清楚楚,照着写就行,递推或者记忆化搜索都行。

这题的时间卡的紧,开始死活过不了,看别人代码把vis数组开成100就过了(原来开的1w),深感此题有问题,sg的值最大应该1w才对(或者我想错了欢迎指出?)

AC 代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <algorithm> using namespace std; int sg[], vis[], s[], k; void getSG() {
sg[] = ;
for(int j = ; j <= ; j++) {
memset(vis, , sizeof(vis));
for(int i = ; i < k; i++) {
if(s[i] <= j) vis[sg[j-s[i]]] = ;
}
for(int i = ; ; i++) {
if(!vis[i]) {
sg[j] = i;
break;
}
}
}
} int main() {
while(~scanf("%d", &k), k) {
for(int i = ; i < k; i++)
scanf("%d", &s[i]);
getSG();
int m;
scanf("%d", &m);
while(m--) {
int l;
scanf("%d", &l);
int ans = ;
while(l--) {
int h;
scanf("%d", &h);
ans ^= sg[h];
}
if(!ans) putchar('L');
else putchar('W');
}
putchar('\n');
}
return ;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <algorithm> using namespace std; int sg[], vis[], s[], k; int getSG(int x) {
if(sg[x] != -) return sg[x];
memset(vis, , sizeof(vis));
for(int i = ; i < k; i++) {
if(s[i] <= x) {
getSG(x-s[i]);
vis[sg[x-s[i]]] = ;
}
}
for(int i = ; ; i++) {
if(!vis[i]) return sg[x] = i;
}
} int main() {
while(~scanf("%d", &k), k) {
for(int i = ; i < k; i++)
scanf("%d", &s[i]);
int m;
scanf("%d", &m);
memset(sg, -, sizeof(sg));
sg[] = ;
for(int i = ; i <= ; i++)
getSG(i);
while(m--) {
int l;
scanf("%d", &l);
int ans = ;
while(l--) {
int h;
scanf("%d", &h);
ans ^= sg[h];
}
if(!ans) putchar('L');
else putchar('W');
}
putchar('\n');
}
return ;
}

超时代码(但感觉非常正确,不知道被卡在哪里)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <algorithm> using namespace std; int sg[], s[], k; void getSG() {
sg[] = ;
for(int j = ; j <= ; j++) {
set <int> S;
for(int i = ; i < k; i++) {
if(s[i] <= j) S.insert(sg[j-s[i]]);
}
int g = ;
while(S.count(g)) g++;
sg[j] = g;
}
} int main() {
while(~scanf("%d", &k), k) {
for(int i = ; i < k; i++)
scanf("%d", &s[i]);
getSG();
int m;
scanf("%d", &m);
while(m--) {
int l;
scanf("%d", &l);
int ans = ;
while(l--) {
int h;
scanf("%d", &h);
ans ^= sg[h];
}
if(!ans) putchar('L');
else putchar('W');
}
putchar('\n');
}
return ;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <algorithm> using namespace std; int sg[], s[], k; int getSG(int x) {
if(sg[x] != -) return sg[x];
set <int> S;
for(int i = ; i < k; i++) {
if(s[i] <= x) {
S.insert(getSG(x-s[i]));
}
}
int g = ;
while(S.count(g)) g++;
return sg[x] = g;
} int main() {
while(~scanf("%d", &k), k) {
for(int i = ; i < k; i++)
scanf("%d", &s[i]);
int m;
scanf("%d", &m);
memset(sg, -, sizeof(sg));
sg[] = ;
for(int i = ; i <= ; i++)
getSG(i);
while(m--) {
int l;
scanf("%d", &l);
int ans = ;
while(l--) {
int h;
scanf("%d", &h);
ans ^= sg[h];
}
if(!ans) putchar('L');
else putchar('W');
}
putchar('\n');
}
return ;
}

HDU 1536 & 1944的更多相关文章

  1. hdu 1536/1944 / POJ 2960 / ZOJ 3084 S-Nim 博弈论

    简单的SG函数应用!!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #inclu ...

  2. hdu 1536&&1944 S-Nim sg函数 难度:0

    S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. S-Nim HDU 1536 博弈 sg函数

    S-Nim HDU 1536 博弈 sg函数 题意 首先输入K,表示一个集合的大小,之后输入集合,表示对于这对石子只能去这个集合中的元素的个数,之后输入 一个m表示接下来对于这个集合要进行m次询问,之 ...

  4. SG 函数初步 HDU 1536 &amp;&amp; HDU 1944

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1944 pid=1536"> http://acm.hdu.edu.cn/showpr ...

  5. hdu 1536/ hdu 1944 S-Nim(sg函数)

    S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  6. 【hdu 1536】S-Nim

    Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...

  7. HDU 1536 S-Nim SG博弈

    S-Nim Problem Description   Arthur and his sister Caroll have been playing a game called Nim for som ...

  8. HDU 1536 sg函数

    S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  9. hdu 1536 S-Nim(sg函数模板)

    转载自:http://blog.csdn.net/sr_19930829/article/details/23446173 解题思路: 这个题折腾了两三天,参考了两个模板,在这之间折腾过来折腾过去,终 ...

随机推荐

  1. [SDN] mininet walkthrough

    本次学习使用的是mininet的VM-image,所以安装过程就先忽略掉了,主要学习使用方法. 同时完成了在虚拟机上配置minient和Wireshark, 可以直接在虚拟机上操作. 1. Every ...

  2. UseFul Collection

    ....... 啦啦啦,test... http://bbs.csdn.net/topics/380175613 http://zhidao.baidu.com/question/580940892. ...

  3. "Resuming debugger: error during debugging loop: TypeError: firstViewRangeElement is null"

    翻译过来:“重启调试器:错误调试期间循环:TypeError:firstViewRangeElement为空” 写了一个项目,其中使用到了上传图片的插件,在本地上传图片一切正常,发布到服务器却不正常了 ...

  4. Linux休眠,挂起,待机,关机的区别及相关命令

    休眠是一种更加省电的模式,它将内存中的数据保存于硬盘中,所有设备都停止工作.当再次使用时需按开关机键,机器将会恢复到您的执行休眠时的状态,而不用再次执行启动操作系统复杂的过程. 待机(挂起)是将当前处 ...

  5. jq 移除包含某个字符串的类名js

    el.removeClass (function (index, css) { return (css.match (/(^|\s)star\S+/g) || []).join(' ');//移除以“ ...

  6. VPN推荐

    最近ZF加强了对谷歌的屏蔽,推荐一些VPN azuressh.com ¥10/m http://www.archsocks.com/ ¥12/年 豆荚VPN,免费800M/月,偶尔连不上,可付费

  7. sqlalchemy 优化count()……

    一.sqlalchemy 中的count() count()统计数据特别慢: session.query(cls).count()  8W 数据花费了近50s 但是在数据库中直接查询: select ...

  8. ERROR 1018 (HY000): Can't read dir of './test/' (errno: 13)

    不能查看mysql中数据库的表. 一.查看 mysql> desc test; ERROR 1046 (3D000): No database selected mysql> use te ...

  9. Div的宽度与高度的100%设定

    div的100%是从其上一级div的宽高继承来的,所以必须设置其上一级div的宽度或高度,否则无效. 举例说明:父div(deman)宽300高200,子div(cc)如果在这个条件下设置divcc的 ...

  10. Android版本更新之本地数据库更新

    最近上架了一个算法学习类APP,在更新应用版本时,发现数据库依旧没有更新,还是上一个版本的数据内容,遂把这方面的内容记录下来. PS:本人处女作APP <算法之家> 可以在豌豆荚.360手 ...