luoguP2148 [SDOI2009]E&D [sg函数][组合游戏]
题目描述
小E 与小W 进行一项名为“E&D”游戏。
游戏的规则如下: 桌子上有2n 堆石子,编号为1..2n。其中,为了方便起见,我们将第2k-1 堆与第2k 堆 (1 ≤ k ≤ n)视为同一组。第i堆的石子个数用一个正整数Si表示。 一次分割操作指的是,从桌子上任取一堆石子,将其移走。然后分割它同一组的另一堆 石子,从中取出若干个石子放在被移走的位置,组成新的一堆。操作完成后,所有堆的石子 数必须保证大于0。显然,被分割的一堆的石子数至少要为2。 两个人轮流进行分割操作。如果轮到某人进行操作时,所有堆的石子数均为1,则此时 没有石子可以操作,判此人输掉比赛。
小E 进行第一次分割。他想知道,是否存在某种策 略使得他一定能战胜小W。因此,他求助于小F,也就是你,请你告诉他是否存在必胜策略。 例如,假设初始时桌子上有4 堆石子,数量分别为1,2,3,1。小E可以选择移走第1堆, 然后将第2堆分割(只能分出1 个石子)。接下来,小W 只能选择移走第4 堆,然后将第3 堆分割为1 和2。最后轮到小E,他只能移走后两堆中数量为1 的一堆,将另一堆分割为1 和1。这样,轮到小W 时,所有堆的数量均为1,则他输掉了比赛。故小E 存在必胜策略。
输入输出格式
输入格式:
第一行是一个正整数T(T ≤ 20),表示测试数据数量。接下来有T组 数据。 对于每组数据,第一行是一个正整数N,表示桌子上共有N堆石子。其中,输入数据保 证N是偶数。 第二行有N个正整数S1..SN,分别表示每一堆的石子数。
输出格式:
包含T 行。对于每组数据,如果小E 必胜,则输出一行”YES”,否则 输出”NO”。
输入输出样例
- 2
- 4
- 1 2 3 1
- 6
- 1 1 1 1 1 1
- YES
- NO
- 【数据规模和约定】
- 对于20%的数据,N = 2;
- 对于另外20%的数据,N ≤ 4,Si ≤ 50;
- 对于100%的数据,N ≤ 2×104,Si ≤ 2×109。
- 应该一看就是求sg函数吧。。
首先是我打表sg函数的代码。
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std;
- const int maxn=;
- int T,n;
- int sg[maxn][maxn];
- int S[];
- void calc(int x,int y){
- memset(S,,sizeof S);
- if(x>)
- for(int i=;i<=(x>>);i++)
- S[sg[i][x-i]]=;
- if(y>)
- for(int i=;i<=(y>>);i++)
- S[sg[i][y-i]]=;
- for(int i=;;i++)
- if(!S[i]){
- sg[x][y]=sg[y][x]=i;
- return;
- }
- }
- void get_sg(){
- for(int i=;i<=;i++)
- for(int j=;j<=i;j++){
- calc(i,j);
- printf("%d %d %d\n",i,j,sg[i][j]);
- }
- for(int i=;i<=;i++){
- for(int j=;j<=;j++) printf("%d ",sg[i][j]);
- puts("");
- }
- }
- int main(){
- get_sg();
- return ;
- }
然后是一段长时间的懵逼。。。
最后推出了这样一个求sg函数的规律
- int sg(int x,int y) {
- ll tmp=;
- for(int i=;;i++,tmp<<=)
- if((x-)%tmp<(tmp>>)&&(y-)%tmp<(tmp>>)) return i;
- }
完整代码大概是这样的,很显然吧。
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std;
- typedef long long ll;
- int T,n;
- int sg(int x,int y) {
- ll tmp=;
- for(int i=;;i++,tmp<<=)
- if((x-)%tmp<(tmp>>)&&(y-)%tmp<(tmp>>)) return i;
- }
- int main() {
- int T;
- scanf("%d",&T);
- int x,y,ans;
- while(T--) {
- scanf("%d",&n); n>>=;
- ans=;
- for(int i=;i<=n;i++) {
- scanf("%d%d",&x,&y);
- ans^=sg(x,y);
- }
- if(ans) puts("YES");
- else puts("NO");
- }
- return ;
- }
luoguP2148 [SDOI2009]E&D [sg函数][组合游戏]的更多相关文章
- Nim 游戏、SG 函数、游戏的和
Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG).满足以 ...
- bzoj 1228 [SDOI2009]E&D SG函数打表 找规律
题目链接 Description 桌子上有2n 堆石子,编号为1..2n.将第2k-1 堆与第2k 堆(1 ≤ k ≤ n)为同一组.第i堆的石子个数用一个正整数Si表示.一次分割操作指的是,从桌子上 ...
- 【转】博弈—SG函数
转自:http://chensmiles.blog.163.com/blog/static/12146399120104644141326/ http://blog.csdn.net/xiaofeng ...
- 【转】博弈问题及SG函数(真的很经典)
博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...
- SG函数
入门一: 首先来玩个游戏,引用杭电课件上的: (1) 玩家:2人:(2) 道具:23张扑克牌:(3) 规则:游戏双方轮流取牌:每人每次仅限于取1张.2张或3张牌:扑克牌取光,则游戏结束:最后取牌的一方 ...
- (转)博弈问题与SG函数
博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...
- 从SG函数浅谈解决博弈问题的通法
基于笔者之前对于几种二元零和博弈游戏的介绍,这里将其思想进行简单的提炼,并引出解决这类二元零和博弈游戏的强大工具——SG函数. 其实对于博弈游戏如Bash.Nim等基本类型,异或一些比较高级的棋类游戏 ...
- SG函数(转自百度百科)
给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负.事实上,这个游戏可以认为是所有Impartial Combinatorial Games的抽象 ...
- (转)博弈 SG函数
此文为以下博客做的摘要: https://blog.csdn.net/strangedbly/article/details/51137432 ---------------------------- ...
随机推荐
- 测试demo 配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- 【Dart学习】--Dart之正则表达式相关方法总结
一,部分属性 RegExp exp = new RegExp(r"(\w+)"); 返回正则表达式的哈希码 print(exp.hashCode); 正则表达式是否区分大小写 pr ...
- 【Flutter学习】页面布局之其它布局处理
一,概述 Flutter中拥有30多种预定义的布局widget,常用的有Container.Padding.Center.Flex.Row.Colum.ListView.GridView.按照< ...
- <自动化测试>之<使用unittest Python测试框架进行参数化测试>
最近在看视频时,虫师简单提到了简化自动化测试脚本用例中的代码量,而python中本身的参数化方法用来测试很糟糕,他在实际操作中使用了parameterized参数化... 有兴趣就查了下使用的方法,来 ...
- delphi 使电脑睡眠代码
//提升进程令牌函数 function AdjustProcessPrivilege(ProcessHandle:THandle;Token_Name:Pchar):boolean; var Toke ...
- AcWing 220.最大公约数 欧拉函数打卡
题目:https://www.acwing.com/problem/content/222/ 题意:求1-n范围内,gcd(x,y)是素数的对数 思路:首先我们可以针对每个素数p,那么他的贡献应该时 ...
- HDU 1828 线段树+扫描线(计算矩形周长并)
题意:给你n个矩形,然后矩形有可能重叠,要你求周长 思路:首先碰到这种矩形在数轴上那么第一反应应该想到的是扫描线, 做周长我们有两种方法 第一种,我们可以分开两部分求,第一遍求x轴上的贡献,第二遍求y ...
- 2017《Java技术》预备作业 计科1502任秀兴
阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的? 我认为,学生和老师的关系,应该亦师亦友.可以以一种朋友的身份去进行教学,是我们理想中的课堂. 在生活中,老师和我们应该多沟通,成为朋友,在有感情的 ...
- EmWin 如何显示汉字 不用在文件中使用编码
1. Font Converter for emWin 生成C文件字库 1.1 新建文件 1.2 选择字体 1.3 为了减小C文件体积,这里只加入自己需要的汉字,先把所有字体取消选择. 1.4 新建一 ...
- textarea高度随文本内容变化,且不出现滚动条
通常文本域的写法如下 <textarea type="text" class="form-control pull-left" id="desc ...