题意:

给你n个硬币,你可以从中拿出来1、2、3个硬币,它们不一定要连续,你只需要保证拿出来的硬币中那个下标最大的硬币一定要是正面朝上,最后谁不能操作,谁就输了

题解:

翻硬币游戏

结论:

局面的SG 值为局面中每个正面朝上的棋子单一存在时的SG 值的异或和。即一个有k个硬币朝上,朝上硬币位置分布在的翻硬币游戏中,SG值是等于k
个独立的开始时只有一个硬币朝上的翻硬币游戏的SG值异或和。比如THHTTH这个游戏中,2号、3号、6号位是朝上的,
它等价于TH、TTH、TTTTTH三个游戏和,即sg[THHTTH]=sg[TH]^sg[TTH]^sg[TTTTTH].我们的重点就可以放在单个硬币朝上时的SG值的求法。

(本篇文章T代表反面朝上,H相反)

根据上面的结论我们可以对题目上输入的THTTHT(假设的一个),SG(THTTHT)=SG(TH)^SG(TTTTH),因此我们只需要求出来H、TH、TTH、TTTH......所有的SG值就可以解决这一道题

初始化SG(T)=0

SG(H),H可以一次操作变成T,所以SG(H)=mex{SG(T)}=mex{0}=1            //mex就是求最小的不在这里面的值,不是负值

SG(TH),可以一次操作变成TT,HT,所以SG(TH)=mex{SG(TT),SG(HT)}=mex{SG(T),SG(H)}=mex{0,1}=2   //根据题意取出来硬币下标最大的应该是H,所以靠右边的T都没用

SG(TTH),可以一次操作变成HHT,TTT,THT,HTT,SG(TTH)=mex{SG(HH),SG(T),SG(TH),SG(H)}=mex{SG(H)^SG(TH),SG(T),SG(TH),SG(H)}

                         mex{1^2,0,2,1}=mex{3,0,2,1}=4;

通过求sg发现规律

sg  1 2 4 7 8 11 13 14

x   0 1 2 3 4  5   6    7

找到规律,sg[x],如果x的二进制1的个数为奇数,sg[x]=2*x ,否则 sg[x]=2*x+1;

然后把各个Sg的值异或最终就是答案

找规律代码:

 1 #include <bits/stdc++.h>
2
3
4
5 using namespace std;
6
7
8
9 const int MAXN = 10005;
10
11
12
13 int SG[MAXN];
14
15 bool SGhash[MAXN];
16
17
18
19 inline int getSG(int x){
20
21 memset(SGhash,false,sizeof SGhash);
22
23 SGhash[0] = true;//翻一个硬币
24
25 for(int i=0 ; i<x ; ++i)SGhash[SG[i]] = true;//翻两个硬币
26
27 for(int i=0 ; i<x ; ++i)
28
29 for(int j=0 ; j<i ; ++j)SGhash[SG[i]^SG[j]] = true;//翻三个硬币
30
31 for(int i=0 ; ; ++i)if(!SGhash[i])return i;
32
33 }
34
35
36
37 inline void BuildSG(int x){
38
39 memset(SG,0,sizeof SG);
40
41 SG[0] = 1;//当head-up硬币位置在0时先手必胜
42
43 for(int i=1 ; i<=x ; ++i){
44
45 SG[i] = getSG(i);
46
47 }
48
49 }
50
51
52
53 int main(){
54
55
56
57 BuildSG(100);
58
59 for(int i=0 ; i<11 ; ++i)printf("%d:%d ",i,SG[i]);
60
61 printf("\n");
62
63 for(int i=11 ; i<20 ; ++i)printf("%d:%d ",i,SG[i]);
64
65
66
67 return 0;
68
69 }

代码:

 1 #include <iostream>
2 #include <cstdio>
3 #include <set>
4 using namespace std;
5
6 int sg(int x){
7 int ans=0,tmp=x;
8 while( x>0 ){
9 if( (x&1) ) ans++;
10 x/=2;
11 }
12 if( (ans&1) ) return 2*tmp;
13 else return 2*tmp+1;
14 }
15
16 int main(){
17 int n,x;
18 while(scanf("%d",&n)!=EOF){
19 int ans=0,x;
20 set <int> mys;
21 for(int i=0;i<n;i++){
22 scanf("%d",&x);
23 mys.insert(x);
24 }
25 for(set <int>::iterator it=mys.begin();it!=mys.end();it++){
26 ans^=sg(*it);
27 }
28 if(ans==0) printf("Yes\n");
29 else printf("No\n");
30 }
31 return 0;
32 }

HDU 3537 Daizhenyang's Coin 翻硬币博弈的更多相关文章

  1. HDU 3537 Daizhenyang's Coin(博弈,翻硬币)

    Daizhenyang's Coin Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. HDU 3537 Mock Turtles型翻硬币游戏

    题目大意: 每次可以翻1个或者2个或者3个硬币,但要保证最右边的那个硬币是正面的,直到不能操作为输,这题目还有说因为主人公感情混乱可能描述不清会有重复的硬币说出,所以要去重 这是一个Mock Turt ...

  3. hdu 3537 Daizhenyang's Coin(博弈-翻硬币游戏)

    题意:每次可以翻动一个.二个或三个硬币.(Mock Turtles游戏) 初始编号从0开始. 当N==1时,硬币为:正,先手必胜,所以sg[0]=1. 当N==2时,硬币为:反正,先手必赢,先手操作后 ...

  4. hdu 3537 Daizhenyang's Coin (翻硬币游戏)

    #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; ]; i ...

  5. HDU 3537 Daizhenyang's Coin

    链接 [http://acm.hdu.edu.cn/showproblem.php?pid=3537] 题意 题意:已知一排硬币中有n个硬币正面朝上,输入正面朝上的硬币的位置ai.两人轮流操作, 每次 ...

  6. hdu 3537 Daizhenyang's Coin 博弈论

    详见:http://www.cnblogs.com/xin-hua/p/3255985.html 约束条件6 代码如下: #include<iostream> #include<st ...

  7. HDU 3537 (博弈 翻硬币) Daizhenyang's Coin

    可以参考Thomas S. Ferguson的<Game Theory>,网上的博客大多也是根据这个翻译过来的,第五章讲了很多关于翻硬币的博弈. 这种博弈属于Mock Turtles,它的 ...

  8. hdu 3537(博弈,翻硬币)

    题意:给定了每个正面朝上的硬币的位置,然后每次可以翻1,2,3枚硬币,并且最右边的硬币开始必须是正面朝上的. 分析: 约束条件6:每次可以翻动一个.二个或三个硬币.(Mock Turtles游戏) 初 ...

  9. 【hdu 3537】Daizhenyang's Coin

    Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

随机推荐

  1. 【Java基础】基本语法-变量与运算符

    基本语法-变量与运算符 关键字和保留字 关键字定义:被 Java 语言赋予了特殊含义,用做专门用途的字符串(单词). 关键字特点:关键字中所有字母都为小写. 用于定义数据类型:class.interf ...

  2. LeetCode703 流中第k大的元素

    前言: 我们已经介绍了二叉搜索树的相关特性,以及如何在二叉搜索树中实现一些基本操作,比如搜索.插入和删除.熟悉了这些基本概念之后,相信你已经能够成功运用它们来解决二叉搜索树问题. 二叉搜索树的有优点是 ...

  3. CSRF - Pikachu

    概述: Cross-site request forgery 简称为"CSRF"(跨站请求伪造),在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标 ...

  4. Centos6.9安装ACFS

    安装完oracle 11GR2的RAC后,使用asmca打开图形化界面后,发现Volumes和ASM Cluster File System两个选项卡不能用 原因是因为ACFS不支持CentOS 解决 ...

  5. 《进击吧!Blazor!》第一章 1.初识 Blazor

    作者介绍 陈超超 Ant Design Blazor 项目贡献者 拥有十多年从业经验,长期基于.Net技术栈进行架构与开发产品的工作,Ant Design Blazor 项目贡献者,现就职于正泰集团 ...

  6. 探索微软开源Python自动化神器Playwright

    相信玩过爬虫的朋友都知道selenium,一个自动化测试的神器工具.写个Python自动化脚本解放双手基本上是常规的操作了,爬虫爬不了的,就用自动化测试凑一凑. 虽然selenium有完备的文档,但也 ...

  7. 二本学生拿到腾讯大厂offer的成长记录

    本人迈莫,是在20年以春招实习生的身份进入鹅厂,经过重重波折,最终成为鹅仔一份子.接下来我会以我亲生经历为例,分享一下普通大学的学生也是可以进去大厂,拭目以待!!! 初入大学 惨遭毒打 时间倒回到17 ...

  8. uni-app开发经验分享十九: uni-app对接微信小程序直播

    uni-app对接微信小程序直播 1.登录微信小程序后台-点击>设置->第三方设置->添加直播插件 2.添加直播组件后->点击<详情>      记录这两个参数直播 ...

  9. 精通MySQL之架构篇

    老刘是即将找工作的研究生,自学大数据开发,一路走来,感慨颇深,网上大数据的资料良莠不齐,于是想写一份详细的大数据开发指南.这份指南把大数据的[基础知识][框架分析][源码理解]都用自己的话描述出来,让 ...

  10. git的使用学习笔记3---关于项目分支创建克隆拉取推送

    一.创建项目 1.打开官网 2.填写相关内容 查看新创建的项目 3.选择方式 4.在git上新建文件夹 1)克隆: mkdir workspace 将代码克隆到本地,取本地配置的.ssh的文件 git ...