题意:David 玩一个石子游戏。

游戏中,有n堆石子,被编号为0..n-1。两名玩家轮流取石子。 每一轮游戏。每名玩家选取3堆石子i,j,k(i<j,j<=k,且至少有一枚石子在第i堆石子中)。 从i中取出一枚石子,并向j。k中各放入一枚石子(假设j=k则向k中放入2颗石子)。

最 先不能取石子的人输。 石子堆的个数不会超过23。每一堆石子不超过1000个。

解法:看上去是将石子都往右移,直到全部都到了n-1堆不能移为止。

首先是考虑每堆石子事实上是独立的一个子游戏,堆与堆之间不相互影响。

然后就是个数是偶数的对不会影响必胜必败态,必败态无法通过移动偶数堆得石子来扭转局面。由于必胜者仅仅需对称操作就可以。所以每堆石子就成了01的状态,sg值仅仅是跟位置有关系了。预处理出每一个位置的sg值就可以。计算第一个可行步骤时候。暴力推断ijk就可以。

代码:

/******************************************************
* @author:xiefubao
*******************************************************/
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string.h>
//freopen ("in.txt" , "r" , stdin);
using namespace std;#define eps 1e-8
#define zero(_) (_<=eps)
const double pi=acos(-1.0);
typedef long long LL;
const int Max=100010;
const LL INF=0x3FFFFFFF;
int sg[100];
bool rem[100];
int n;
void init()
{sg[0]=0;for(int i=1; i<=25; i++){memset(rem,0,sizeof rem);for(int j=i-1; j>=0; j--)for(int k=j; k>=0; k--){rem[sg[j]^sg[k]]=1;}int t=0;while(rem[t]) t++;sg[i]=t;}
}
bool help[100];
//0 1 2 4 7 8 11 13 14 16 19 21 22 25 26 28 31 32 35 37 38 41 42
int main()
{init();int kk=1;while(cin>>n&&n){memset(help,0,sizeof help);int ans=0;for(int i=0; i<n; i++){int a;scanf("%d",&a);if(a)help[i]=1;if(a&1){ans^=sg[n-1-i];}}printf("Game %d: ",kk++);if(ans){for(int i=0; i<n-1; i++){if(help[i]){for(int j=i+1; j<n; j++)for(int k=j; k<n; k++){if((ans^sg[n-1-i]^sg[n-1-j]^sg[n-1-k])==0){printf("%d %d %d\n",i,j,k);goto end;}}}}
end:;}elseputs("-1 -1 -1");}return 0;
}

uva 1378 - A Funny Stone Game sg博弈相关推荐

  1. UVA - 1378 A Funny Stone Game(博弈+sg函数)

    题目链接:点击查看 题目大意:给出n堆石子,两人轮流按照规则操作,不能操作的一方即为输 规则:每次将第i堆减少一个石子,将第j堆和第k堆增加一个石子,i,j,k满足(i<j<=k) 若先手 ...

  2. 【算法与数据结构】—— 博弈论(高阶篇之SG博弈)

    博弈论之SG博弈 SG博弈的命名源于SG函数和SG定理,而SG函数的出现则来自于一个简单的取石子游戏: 有1堆n个的石子,每次只能取{1,3,4}个石子,先取完石子者胜利,判断对于不同的n,先手能否取 ...

  3. 博弈论学习之巴什博弈,尼姆博弈, sg博弈

    博弈论真是一个神奇的东西,感觉和博弈论厉害的人玩游戏绝对会输. 这个博客讲的很好很全面 此类问题一般有如下特点: 1.博弈模型为两人轮流决策的非合作博弈.即两人轮流进行决策,并且两人都使用最优策略来获 ...

  4. 博弈基础与例题分析(巴什博弈威佐夫博弈尼姆博奕 斐波那契博弈SG博弈)

    文章目录 巴什博弈Bash Game 威佐夫博弈Wythoff Game 尼姆博奕 斐波那契博弈:算法如其名 SG博弈 图 mex(minimal excludant)运算 获得sg表 应用 A Br ...

  5. 牛客小白月赛7 B自杀游戏(sg博弈)

    sg博弈结论为,下个状态sg的补集的最小值. 题目 #include<bits/stdc++.h> using namespace std; const int maxn=1e5+9; b ...

  6. 【UVA1378】A Funny Stone Game (博弈-求SG值-输出方案)

    [题目] Description The funny stone game is coming. There are n piles of stones, numbered with 0, 1, 2, ...

  7. hdu 1848(Fibonacci again and again)(SG博弈)

    Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  8. POJ 1740 A New Stone Game(博弈)题解

    题意:有n个石子堆,每一个都可以轮流做如下操作:选一个石堆,移除至少1个石子,然后可以把这堆石子随便拿几次,随便放到任意的其他石子数不为0的石子堆,也可以不拿.不能操作败. 思路:我们先来证明,如果某 ...

  9. HDU1847:Good Luck in CET-4 Everybody!(SG博弈)

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

最新文章

  1. Struct 和 Class 性能有差异吗?自己测试
  2. 《C程序设计伴侣》诞生记
  3. HaoZip(好压) 去广告纯净版 4.4
  4. 做生意最重要的诚信呢??? | 今日最佳
  5. Command(命令)--对象行为型模式
  6. 前端学习(1604):脚手架props与state
  7. mysql操作数据库
  8. python time,datetime与highchart中的time
  9. drupal_Drupal社区在DevOps采纳中的地位
  10. 涉及到大小变化,类似QScrollArea判断大小是否显示滚动条
  11. 用位运算实现内存对齐
  12. python 教材 配套 试题库_Python语言应用2020满分完整版考 试题库大全
  13. attachEvent方法的作用
  14. 【MongoDB】索引属性 之 唯一索引
  15. linux命令行取出网卡ip地址
  16. java duplicate key_Stream 操作 Duplicate key问题
  17. 位(bit), 字节(byte), 字(word),双字(dword or Qword)释义
  18. 掌财社寒山:俄罗斯银行将在年底前推出数字卢布原型
  19. r语言python0基础_万丈高楼平地起,从零开始学R语(生信分析向,R语言基础)...
  20. uni-app之网络请求解决跨域

热门文章

  1. VB 获取计算机的分辨率大小
  2. initrd.img处理
  3. 天天打无人车是怎样一种体验?
  4. 首部高中AI基础教材出版发布:汤晓鸥主编,40所重点中学引入
  5. 别人家只会编段子,谷歌带大家找乐子 | 愚人节の真 · 大型线下踏春游戏
  6. 什么叫AI优先?不如你看谷歌CEO的办公位在哪儿
  7. 最近有啥ML比赛能表现自己的优秀?CVPR2018图像压缩大赛
  8. Nodejs+socket.io搭建WebRTC信令服务器
  9. Haproxy的部署安装
  10. 颠覆Git 命令使用体验的神器 - tig