题意: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:
;
}
else
puts("-1 -1 -1");
}
return 0;
}

uva 1378 - A Funny Stone Game sg博弈的更多相关文章

  1. uva 1378 A Funny Stone Game (博弈-SG)

    题目链接:http://vjudge.net/problem/viewProblem.action?id=41555 把第i堆的每个石子看出一堆个数为n-i的石子,转换为组合游戏 #include & ...

  2. uva 1378 - A Funny Stone Game(组合游戏)

    题目链接:uva 1378 - A Funny Stone Game 题目大意:两个人玩游戏,对于一个序列,轮流操作.每次选中序列中的i,j,k三个位置要求i<j≤k,然后arr[i]减1,对应 ...

  3. Uva 1378 - A Funny Stone Game

    1378 - A Funny Stone Game Time limit: 3.000 seconds The funny stone game is coming. There are n pile ...

  4. UVa 1378 A Funny Stone Game [博弈论 SG函数]

    A Funny Stone Game 题意: $n \le 23$堆石子,每次选择$i < j \le k$,从$i$拿走1颗$j,k$各放入一颗,不能取就失败.求先手是否必胜以及第一次取的策略 ...

  5. UVA1378 A Funny Stone Game —— SG博弈

    题目链接:https://vjudge.net/problem/UVA-1378 题意: 两个人玩游戏,有n堆石子,两人轮流操作:于第i堆石子中取走一块石子,然后再往第j.k堆中各添加一块石子.其中 ...

  6. UVA12293 Box Game —— SG博弈

    题目链接:https://vjudge.net/problem/UVA-12293 题意: 两人玩游戏,有两个盒子,开始时第一个盒子装了n个球, 第二个盒子装了一个球.每次操作都将刷量少的盒子的球倒掉 ...

  7. UVA1482 Playing With Stones —— SG博弈

    题目链接:https://vjudge.net/problem/UVA-1482 题意: 有n堆石子, 每堆石子有ai(ai<=1e18).两个人轮流取石子,要求每次只能从一堆石子中抽取不多于一 ...

  8. uva 1567 - A simple stone game(K倍动态减法游戏)

    option=com_onlinejudge&Itemid=8&page=show_problem&problem=4342">题目链接:uva 1567 - ...

  9. HDU 1848(sg博弈) Fibonacci again and again

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

随机推荐

  1. Django数据库的查看、删除,创建多张表并建立表之间关系

    配置以下两处,可以方便我们直接右键运行tests.py一个文件,实现对数据库操作语句的调试: settings里面的设置: #可以将Django对数据库的操作语法,能输出对应的的sql语句 LOGGI ...

  2. Java判断浏览器是微信还是支付宝

    private static final String WX_AGENT = "micromessenger"; private static final String ALI_A ...

  3. queue 类

    一:普通队列 1.队列特征:先进先出,它只允许在一端(队尾)进行插入元素操作,在另一端(队头)进行删除元素操作 2. 存取类函数 front():用来取出queue中的队头元素,对应于front()函 ...

  4. hdu6038[找规律+循环节] 2017多校1

    /*hdu6038[找规律+循环节] 2017多校1*/ #include<bits/stdc++.h> using namespace std; typedef long long LL ...

  5. 二进制<2>

    位运算简介及实用技巧(二):进阶篇(1) =====   真正强的东西来了!   ===== 二进制中的1有奇数个还是偶数个    我们可以用下面的代码来计算一个32位整数的二进制中1的个数的奇偶性, ...

  6. HUST——1106xor的难题之二(异或树状数组单点修改和区间查询)

    1106: xor的难题之二 时间限制: 2 Sec  内存限制: 128 MB 提交: 8  解决: 3 题目描述 上次Alex学长的问题xor难题很简单吧,现在hkhv学长有个问题想问你们. 他现 ...

  7. [luoguP2764] 最小路径覆盖问题(最大流 || 二分图最大匹配)

    传送门 可惜洛谷上没有special judge,不然用匈牙利也可以过的,因为匈牙利在增广上有一个顺序问题,所以没有special judge就过不了了. 好在这个题的测试数据比较特殊,如果是网络流的 ...

  8. BZOJ2285 [SDOI2011]保密 【01分数规划 + 网络流】

    题目 现在,保密成为一个很重要也很困难的问题.如果没有做好,后果是严重的.比如,有个人没有自己去修电脑,又没有拆硬盘,后来的事大家都知道了. 当然,对保密最需求的当然是军方,其次才是像那个人.为了应付 ...

  9. 【bzoj1592】[Usaco2008 Feb]Making the Grade 路面修整

    FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了N段,N个整数A_1, ...

  10. google jib容器打包工具

    简介 Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库,以 Maven 和 Gradle 插件形式提供. 通过 Jib,Java 开发者可以使用他们 ...