HDU1729 Stone Game (SG函数)

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1729

题意:

又n个盒子,每个盒子的可以放 S个石头,里面已经有的石头的个数为C;

每次可以放的石头的个数不超过C*C。先手胜的输出Yes,后手胜输出No.

分析:

必败的状态很好找 当C + C * C < S && (C + 1) + (C + 1) * (C + 1) > = S;

然后我们对于每一组(c,s)来寻找他的必败状态。

枚举for(i = 1 ; i + i * i > = s;i++)

然后将 i 与 c 进行比较,

如果 c > i, 那么这是一个必胜的状态 sg值为  s - c;

这点不懂得可以看看这个 http://blog.163.com/[email protected]/blog/static/171370086201101711276278/

如果  c == i , 那么必败。

如果 c < i  将i 看成 S 继续递归求解

代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int get(int c,int s){
    int q=0;
    while(q+q*q<s)
        q++;
    q--;
    if(c>q) return s-c;
    else return get(c,q);
}

int main()
{
    int n,cas=1;
    while(~scanf("%d",&n)&&n){
        int s,c,ans=0;
        for(int i=0;i<n;i++){
            scanf("%d%d",&s,&c);
            ans^=get(c,s);
        }
        printf("Case %d:\n",cas++);
        if(ans) puts("Yes");
        else   puts("No");
    }
    return 0;
}



时间: 2024-10-12 10:33:12

HDU1729 Stone Game (SG函数)的相关文章

hdu 1729 Stone Game SG函数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1729 题意:2个玩家,有N个箱子,每个箱子的大小是Si,游戏开始前,就有一些石子在这些箱子里了. 游戏者轮流选择箱子,然后把石子放入箱子里.并且放入的石子数量不能大于原来箱子里就有的石子的数量的平方. 比如说,一个箱子里已经有了3个石头,则可以放1-9个石头(小于箱子的容量). 当轮到某人时,不能再放石子则为输. 问能否找到一种策略使先手必赢. 学习了一下SG函数. 在公平的组合游戏中(游戏规则对于

Light OJ 1296 - Again Stone Game (博弈sg函数递推)

F - Again Stone Game Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Description Alice and Bob are playing a stone game. Initially there are n piles of stones and each pile contains some stone. Alice stars the

hdoj 1729 Stone Games(SG函数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1729 看了题目感觉像Nim,但是有范围限制,有点不知道SG函数该怎么写 看了题解,最后才明白该怎么去理解 . 首先进行对s和c进行分类, 1.c = 0 的时候,无论怎样都填不满,直接跳过: 2.c = s 的时候,先手必败,即是P态: 3.c < s 的时候,可以分为两种情况: 1)c^2 + c < s 的时候,递归 2)c^2 + c > s 的时候,先手必胜,即N态 1 int me

(转载)--SG函数和SG定理【详解】

在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的性质: 1.所有终结点是 必败点 P .(我们以此为基本前提进行推理,换句话说,我们以此为假设) 2.从任何必胜点N 操作,至少有一种方式可以进入必败点 P. 3.无论如何操作,必败点P 都只能进入 必胜点 N. 我们研究必胜点和必败点的目的时间为题进行简化,有助于

SG函数和SG定理【详解】

在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的性质: 1.所有终结点是 必败点 P .(我们以此为基本前提进行推理,换句话说,我们以此为假设) 2.从任何必胜点N 操作,至少有一种方式可以进入必败点 P. 3.无论如何操作,必败点P 都只能进入 必胜点 N. 我们研究必胜点和必败点的目的时间为题进行简化,有助于

hdu 2999 sg函数(简单博弈)

Stone Game, Why are you always there? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 393    Accepted Submission(s): 132 Problem Description "Alice and Bob are playing stone game...""E

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

在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的性质: 1.所有终结点是 必败点 P .(我们以此为基本前提进行推理,换句话说,我们以此为假设) 2.从任何必胜点N 操作,至少有一种方式可以进入必败点 P. 3.无论如何操作,必败点P 都只能进入 必胜点 N. 我们研究必胜点和必败点的目的时间为题进行简化,有助于

SG函数入门

SG函数入门 必胜点与必败点 概念 P点:必败点,换句话说,就是在双方都选择最优策略的情况下,谁处于此状态谁必败. N点:必胜点,换句话说,就是在双方都选择最优策略的情况下,谁处于此状态谁必胜. 性质 1.所有的终结点都是必败点P. 2.从任意的必胜点N进行操作,至少有一种方式到达一个必败点. 3.从任意的一个必败点P进行操作,只可能到达必胜点N. 我们研究必胜点与必败点的目的是以此为题来简化博弈的情况,有助于我们分析策略.通常我们分析必胜点和必败点都是以终结点为起始点进行逆序分析. 我们以一道

TYVJ 2049 魔法珠 sg函数

题意:链接 方法:sg函数 解析: tyvj的题大部分都没题解啊- - 不过这样貌似会更好?感觉做这的题都需要自己动脑啊- - 虽然嘴上说着好烦然而心里觉得好评? 回归正题 设sg[x]表示数x的sg值,这好像是废话 然后对于读入的a[i],将所有的a[i]的sg值异或起来如果不是零则先手赢反之后手 维护的时候有个坑. 每次求约数的时候,数组要在sg里开,因为如果递归下去的话,全局变量的话会被更改,会被坑死. 然后就是怎么维护了 对于x,先求约数 之后枚举哪个数不取,将其他的异或(或者先都异或起