题目描述

小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”。

输入输出样例

输入样例#1:

  1. 2
  2. 4
  3. 1 2 3 1
  4. 6
  5. 1 1 1 1 1 1
输出样例#1:

  1. YES
  2. NO
  3. 【数据规模和约定】
  4. 对于20%的数据,N = 2
  5. 对于另外20%的数据,N 4Si 50
  6. 对于100%的数据,N 2×104Si 2×109

  1. 应该一看就是求sg函数吧。。
    首先是我打表sg函数的代码。
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. using namespace std;
  5.  
  6. const int maxn=;
  7.  
  8. int T,n;
  9. int sg[maxn][maxn];
  10. int S[];
  11.  
  12. void calc(int x,int y){
  13. memset(S,,sizeof S);
  14. if(x>)
  15. for(int i=;i<=(x>>);i++)
  16. S[sg[i][x-i]]=;
  17. if(y>)
  18. for(int i=;i<=(y>>);i++)
  19. S[sg[i][y-i]]=;
  20. for(int i=;;i++)
  21. if(!S[i]){
  22. sg[x][y]=sg[y][x]=i;
  23. return;
  24. }
  25. }
  26.  
  27. void get_sg(){
  28. for(int i=;i<=;i++)
  29. for(int j=;j<=i;j++){
  30. calc(i,j);
  31. printf("%d %d %d\n",i,j,sg[i][j]);
  32. }
  33. for(int i=;i<=;i++){
  34. for(int j=;j<=;j++) printf("%d ",sg[i][j]);
  35. puts("");
  36. }
  37. }
  38.  
  39. int main(){
  40. get_sg();
  41. return ;
  42. }

然后是一段长时间的懵逼。。。

最后推出了这样一个求sg函数的规律

  1. int sg(int x,int y) {
  2. ll tmp=;
  3. for(int i=;;i++,tmp<<=)
  4. if((x-)%tmp<(tmp>>)&&(y-)%tmp<(tmp>>)) return i;
  5. }

完整代码大概是这样的,很显然吧。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. using namespace std;
  5.  
  6. typedef long long ll;
  7. int T,n;
  8.  
  9. int sg(int x,int y) {
  10. ll tmp=;
  11. for(int i=;;i++,tmp<<=)
  12. if((x-)%tmp<(tmp>>)&&(y-)%tmp<(tmp>>)) return i;
  13. }
  14.  
  15. int main() {
  16. int T;
  17. scanf("%d",&T);
  18. int x,y,ans;
  19. while(T--) {
  20. scanf("%d",&n); n>>=;
  21. ans=;
  22. for(int i=;i<=n;i++) {
  23. scanf("%d%d",&x,&y);
  24. ans^=sg(x,y);
  25. }
  26. if(ans) puts("YES");
  27. else puts("NO");
  28. }
  29. return ;
  30. }

luoguP2148 [SDOI2009]E&D [sg函数][组合游戏]的更多相关文章

  1. Nim 游戏、SG 函数、游戏的和

    Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG).满足以 ...

  2. bzoj 1228 [SDOI2009]E&D SG函数打表 找规律

    题目链接 Description 桌子上有2n 堆石子,编号为1..2n.将第2k-1 堆与第2k 堆(1 ≤ k ≤ n)为同一组.第i堆的石子个数用一个正整数Si表示.一次分割操作指的是,从桌子上 ...

  3. 【转】博弈—SG函数

    转自:http://chensmiles.blog.163.com/blog/static/12146399120104644141326/ http://blog.csdn.net/xiaofeng ...

  4. 【转】博弈问题及SG函数(真的很经典)

    博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...

  5. SG函数

    入门一: 首先来玩个游戏,引用杭电课件上的: (1) 玩家:2人:(2) 道具:23张扑克牌:(3) 规则:游戏双方轮流取牌:每人每次仅限于取1张.2张或3张牌:扑克牌取光,则游戏结束:最后取牌的一方 ...

  6. (转)博弈问题与SG函数

    博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...

  7. 从SG函数浅谈解决博弈问题的通法

    基于笔者之前对于几种二元零和博弈游戏的介绍,这里将其思想进行简单的提炼,并引出解决这类二元零和博弈游戏的强大工具——SG函数. 其实对于博弈游戏如Bash.Nim等基本类型,异或一些比较高级的棋类游戏 ...

  8. SG函数(转自百度百科)

    给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负.事实上,这个游戏可以认为是所有Impartial Combinatorial Games的抽象 ...

  9. (转)博弈 SG函数

    此文为以下博客做的摘要: https://blog.csdn.net/strangedbly/article/details/51137432 ---------------------------- ...

随机推荐

  1. 测试demo 配置

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  2. 【Dart学习】--Dart之正则表达式相关方法总结

    一,部分属性 RegExp exp = new RegExp(r"(\w+)"); 返回正则表达式的哈希码 print(exp.hashCode); 正则表达式是否区分大小写 pr ...

  3. 【Flutter学习】页面布局之其它布局处理

    一,概述 Flutter中拥有30多种预定义的布局widget,常用的有Container.Padding.Center.Flex.Row.Colum.ListView.GridView.按照< ...

  4. <自动化测试>之<使用unittest Python测试框架进行参数化测试>

    最近在看视频时,虫师简单提到了简化自动化测试脚本用例中的代码量,而python中本身的参数化方法用来测试很糟糕,他在实际操作中使用了parameterized参数化... 有兴趣就查了下使用的方法,来 ...

  5. delphi 使电脑睡眠代码

    //提升进程令牌函数 function AdjustProcessPrivilege(ProcessHandle:THandle;Token_Name:Pchar):boolean; var Toke ...

  6. AcWing 220.最大公约数 欧拉函数打卡

    题目:https://www.acwing.com/problem/content/222/ 题意:求1-n范围内,gcd(x,y)是素数的对数 思路:首先我们可以针对每个素数p,那么他的贡献应该时  ...

  7. HDU 1828 线段树+扫描线(计算矩形周长并)

    题意:给你n个矩形,然后矩形有可能重叠,要你求周长 思路:首先碰到这种矩形在数轴上那么第一反应应该想到的是扫描线, 做周长我们有两种方法 第一种,我们可以分开两部分求,第一遍求x轴上的贡献,第二遍求y ...

  8. 2017《Java技术》预备作业 计科1502任秀兴

    阅读邹欣老师的博客,谈谈你期望的师生关系是什么样的? 我认为,学生和老师的关系,应该亦师亦友.可以以一种朋友的身份去进行教学,是我们理想中的课堂. 在生活中,老师和我们应该多沟通,成为朋友,在有感情的 ...

  9. EmWin 如何显示汉字 不用在文件中使用编码

    1. Font Converter for emWin 生成C文件字库 1.1 新建文件 1.2 选择字体 1.3 为了减小C文件体积,这里只加入自己需要的汉字,先把所有字体取消选择. 1.4 新建一 ...

  10. textarea高度随文本内容变化,且不出现滚动条

    通常文本域的写法如下 <textarea type="text" class="form-control pull-left" id="desc ...