题目链接:uva 1378 - A Funny Stone Game

题目大意;两个人玩游戏,对于一个序列,轮流操作。每次选中序列中的i,j,k三个位置要求i<j≤k,然后arr[i]减1,对应的arr[j]和arr[k]加1,不能操作的人输,问先手是否必胜。必胜的话给出字典序最下的必胜方案。负责输出-1.

解题思路:首先预处理出各个位置上的SG值,然后对于给定序列,枚举位置转移状态后推断是否为必败态就可以。

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int maxn = 30; int n, g[maxn], s[maxn]; int SG (int l) {
int vis[1000];
memset(vis, 0, sizeof(vis)); for (int i = 0; i < l; i++) {
for (int j = 0; j < l; j++)
vis[g[i]^g[j]] = 1;
} int ret = -1;
while (vis[++ret]);
return ret;
} void init () {
g[0] = 0;
for (int i = 1; i < maxn; i++)
g[i] = SG(i);
} int judge () {
int ret = 0;
for (int i = 0; i < n-1; i++) {
if (s[i]&1)
ret ^= g[n-1-i];
}
return ret;
} void put_ans () {
for (int i = 0; i < n-1; i++) {
if (s[i] == 0)
continue; s[i]--;
for (int j = i+1; j < n; j++) {
s[j]++;
for (int k = j; k < n; k++) {
s[k]++;
if (judge() == 0) {
printf(" %d %d %d\n", i, j, k);
return;
}
s[k]--;
}
s[j]--;
}
s[i]++;
}
} int main () {
init();
int cas = 1;
while (scanf("%d", &n) == 1 && n) {
for (int i = 0; i < n; i++)
scanf("%d", &s[i]); printf("Game %d:", cas++);
if (judge())
put_ans();
else
printf(" -1 -1 -1\n");
}
return 0;
}

uva 1378 - A Funny Stone Game(组合游戏)的更多相关文章

  1. 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 ...

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

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

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

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

  4. POJ1740A New Stone Game[组合游戏]

    A New Stone Game Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5769   Accepted: 3158 ...

  5. uva 1378 - A Funny Stone Game sg博弈

    题意:David 玩一个石子游戏. 游戏中,有n堆石子,被编号为0..n-1.两名玩家轮流取石子. 每一轮游戏.每名玩家选取3堆石子i,j,k(i<j,j<=k,且至少有一枚石子在第i堆石 ...

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

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

  7. 组合游戏 - SG函数和SG定理

    在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点 ...

  8. Nim游戏(组合游戏Combinatorial Games)

    http://baike.baidu.com/view/1101962.htm?fr=aladdin Nim游戏是博弈论中最经典的模型(之一),它又有着十分简单的规则和无比优美的结论 Nim游戏是组合 ...

  9. HDU 1536 S-Nim (组合游戏+SG函数)

    题意:针对Nim博弈,给定上一个集合,然后下面有 m 个询问,每个询问有 x 堆石子 ,问你每次只能从某一个堆中取出 y 个石子,并且这个 y 必须属于给定的集合,问你先手胜还是负. 析:一个很简单的 ...

随机推荐

  1. JavaNIO阻塞IO

    package com.java.NIO; import java.io.IOException; import java.net.InetSocketAddress; import java.nio ...

  2. ⑦bootstrap按钮 图片 辅助使用基础案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Windows系统下python3中安装pyMysql

    python2和python3是不兼容的,在py2中,链接数据库使用的是mysqldb,但在py3中是不能用的. 解决办法就是在py3中数据库使用的模块是pyMysql. 在dos窗口中安装第三方库会 ...

  4. C#截取当前活动窗体的图片

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. Nodejs前端服务器压缩图片

    Nodejs作为前端服务器,自然能承担处理图片的能力, 使用GM for nodejs 作为图片处理器,调用ImageMagick处理图片 使用ImageMagick var imageMagick ...

  6. 前端面试题(3) cookie,sessionStorage和localStorage的区别

    cookie是网站为了标示用户身份存在用户本地终端上的数据(经过加密). cookie数据时钟在同源的http请求中携带(即使不需要),即会在浏览器和服务器之间传递. seeeionStorage和l ...

  7. shopxx--权限功能测试

    shiro权限控制 一.添加角色 1.打开   系统→角色管理,点击 添加 赋予当前角色对应的权限 二.添加管理员(即用户管理) 添加用户,赋予刚才添加的角色 三.用新用户登录,进行测试 登录结果

  8. 作为新手 HTML5如何自学为好?

    互联网发展到今天,越来越多的技术岗位人才出现了稀缺的状态,就拿当前的HTML5来讲,基本成为了每家互联网公司不可缺少的人才.如果抓住这个机会,把HTML5搞好,那么前途不可限量,而且这门行业是越老越吃 ...

  9. Entity Framework——建模建库

    1数据库初始化策略选择 三种初始化策略: 1)CreateDatabaseIfNotExists:默认的策略.如果数据库不存在,那么就创建数据库.但是如果数据库已存在,而且实体发生了变化,就会出现异常 ...

  10. ThinkPHP中处理模板引擎的volist标签

    Volist标签主要用于在模板中循环输出数据集或者多维数组 必须得属性有:name属性,要输出的数据模板变量,id是循环变量. 其他属性参见开发手册. 通常模型的select方法返回的结果是一个二维数 ...