[BZOJ 1874] [BeiJing2009 WinterCamp] 取石子游戏 【博弈论 | SG函数】
题目链接:BZOJ - 1874
题目分析
这个是一种组合游戏,是许多单个SG游戏的和。
就是指,总的游戏由许多单个SG游戏组合而成,每个SG游戏(也就是每一堆石子)之间互不干扰,每次从所有的单个游戏中选一个进行决策,如果所有单个游戏都无法决策,游戏失败。
有一个结论,SG(A + B + C ... ) = SG(A)^SG(B)^SG(C) ...
这道题每堆石子不超过 1000 , 所以可以把 [0, 1000] 的 SG 值暴力求出来,使用最原始的 SG 函数的定义, SG(u) = mex(SG(v)) E(u -> v) 。
注意 m <= 10 所以一个状态 i 的后继状态不超过 10 个,那么它的 SG 值不会超过 10 。
然后将每一堆的 SG 值异或起来。如果必胜,就按照顺序枚举一下所有初始方案,找到必胜的就输出并退出。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath> using namespace std; const int MaxNum = 1000 + 5, MaxN = 10 + 5; int n, m, Mark_Index;
int A[MaxN], B[MaxN], SG[MaxNum], Mark[MaxN]; void Calc_SG() {
SG[0] = 0;
Mark_Index = 0;
memset(Mark, 0, sizeof(Mark));
for (int i = 1; i <= 1000; ++i) {
++Mark_Index;
for (int j = 1; j <= m; ++j) {
if (B[j] > i) continue;
Mark[SG[i - B[j]]] = Mark_Index;
}
for (int j = 0; j <= 10; ++j) {
if (Mark[j] != Mark_Index) {
SG[i] = j;
break;
}
}
}
} int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", &A[i]);
scanf("%d", &m);
for (int i = 1; i <= m; ++i) scanf("%d", &B[i]);
Calc_SG();
int Temp = 0;
for (int i = 1; i <= n; ++i) Temp ^= SG[A[i]];
if (Temp == 0) printf("NO\n");
else {
printf("YES\n");
bool Flag = false;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (B[j] > A[i]) continue;
if ((Temp ^ SG[A[i]] ^ SG[A[i] - B[j]]) == 0) {
Flag = true;
printf("%d %d\n", i, B[j]);
break;
}
}
if (Flag) break;
}
}
return 0;
}
[BZOJ 1874] [BeiJing2009 WinterCamp] 取石子游戏 【博弈论 | SG函数】的更多相关文章
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]
小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子,每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作,他想问你他是否有必胜策略,如 ...
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 871 Solved: 365[Submit][Status][Discuss] Description ...
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏
Time Limit: 5 Sec Memory Limit: 162 MB Submit: 957 Solved: 394 [Submit][Status][Discuss] Description ...
- bzoj 1874: [BeiJing2009 WinterCamp]取石子游戏【博弈论】
先预处理出来sg值,然后先手必败状态就是sg[a[i]]的xor和为0(nim) 如果xor和不为0,那么一定有办法通过一步让xor和为0,具体就是选一个最大的sg[a[i]],把它去成其他sg值的x ...
- [BeiJing2009 WinterCamp]取石子游戏 Nim SG 函数
Code: #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ...
- 1874: [BeiJing2009 WinterCamp]取石子游戏 - BZOJ
Description小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子,每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作,他想问 ...
- bzoj1874 [BeiJing2009 WinterCamp]取石子游戏
1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 925 Solved: 381[ ...
- [bzoj1874][BeiJing2009 WinterCamp]取石子游戏_博弈论
取石子游戏 bzoj-1874 BeiJing2009 WinterCamp 题目大意:题目链接. 注释:略. 想法: 我们通过$SG$函数的定义来更新$SG$的转移. 如果是寻求第一步的话我们只需要 ...
- 【BZOJ1874】取石子游戏(SG函数)
题意:小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子, 每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作, 他想问你他是否有必 ...
随机推荐
- Scrapy的shell命令(转)
scrapy python MrZONT 2015年08月29日发布 ...
- 学习了几天的jQuery Mobile的一点感受
一.Write less Do more! 这好像就是jQuery Mobile的口号吧.基于jQuery类库的jQuery Mobile移动web插件,有了这个轻量级插件后,排版方便了许多,很多样 ...
- java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误
java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误. 问题: 创建了一个工 ...
- Google Web Toolkit (GWT)怎么制作多个用户界面
Google Web Toolkit即GWT是目前基于AJAX技术开发的一个比较成功的框架包,但是其附带例程中只有单页面的实例,那么应该怎么样制作多个页面呢? 其实很简单,GWT的一个模块,就是一个页 ...
- [转]javascript中style.left和offsetLeft的使用
如果父div的position定义为relative,子div的position定义为absolute,那么子div的style.left的值是相对于父div的值,这同offsetLeft是相同的,区 ...
- AFNetworking 使用总结
NSString *URLTmp = @""; NSString *URLTmp1 = [URLTmp stringByAddingPercentEscapesUsingEncod ...
- android 在布局中动态添加控件
第一步 final LayoutInflater inflater = LayoutInflater.from(this); 第二步:获取需要被添加控件的布局 final LinearLayout l ...
- Qt 学习之路 :信号槽
信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被 ...
- [转] json in javascript
JavaScript is a general purpose programming language that was introduced as the page scripting langu ...
- html input 文本框的一些操作(限制输入...)
1.取消按钮按下时的虚线框 在input里添加属性值 hideFocus 或者 HideFocus=true 2.只读文本框内容 在input里添加属性值 readonly 3.防止退后清空的TEXT ...