zoukankan      html  css  js  c++  java
  • bzoj3609 [Heoi2014]人人尽说江南好 博弈

    [Heoi2014]人人尽说江南好

    Time Limit: 10 Sec  Memory Limit: 256 MB
    Submit: 581  Solved: 420
    [Submit][Status][Discuss]

    Description

      小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家),

    最近他 想起了小时候在江南玩过的一个游戏。 
       在过去,人们是要边玩游戏边填词的,比如这首《菩萨蛮》就是当年韦庄在玩游戏时填 的:
        人 人 尽 说 江 南 好, 游 人 只 合 江 南 老。 
       然而我们今天不太关心人们填的词是什么,我们只关心小 Z 那时玩过的游戏。游戏
    的规 则是这样的,给定 N 堆石子,每堆石子一开始只有 1 个。小 Z 和他的小伙伴轮
    流操作, 小 Z 先行操作。操作可以将任意两堆石子合并成为一堆,当谁不再能操作的
    时候,谁就输掉了。 不过,当一堆石子堆的太高时可能发生危险,因此小 Z 和他的小
    伙伴规定,任何时刻任意一 堆石子的数量不能超过 m。即假如现在有两堆石子分别有
     a 个和 b 个,而且 a+b>m,那么这 两堆石子就不能合成一堆。 
           小 Z 和他的小伙伴都是很聪明的,所以他们总是会选择对自己最有
    利的策略。现在小 Z 想要知道,在这种情况下,对于一个给定的 n 和 m,到底是谁
    能够获得胜利呢? 

    Input

     本题包括多组数据  数据第一行为一个数 T,为数据组数 
     以下 T 行,每行两个正整数 n,m 
     

    Output

     输出 T 行,每行为 0 或 1,如果为 0 意为小 Z(即先手)会取得胜利,为 1 则为后

    手会 取得胜利。 
     

    Sample Input

    5
    7 3
    1 5
    4 3
    6 1
    2 2

    Sample Output

    1
    1
    1
    1
    0

    HINT

      100%的数据, n,m<=1000000000, T<=100 

    Source

     
    题解:
       找规律。。。。

    感觉一定最后是m,m,…,n%m。试了试样例发现很对然后就A了>< 
    证明: 
    无论先手后手,只要想就一定能造出m,m,…,n%m。这样的话此时胜利的人必定会构造这种局面。 
    1、先手想构造 
    先手1+1=2 
    如果此时后手1+2=3,则先手1+3=4 
    如果此时后手1+1=2,则先手2+2=4 
    就是说先手可以构造自己放完后只有一堆非1且为偶数 
    同理后手能构造自己放完后只有一堆非1且为奇数 
    当m为奇数 

    先手想构造 
    当先手造出了m-1后,如果后手让m-1加一变成m,则造出一个m同时回到先手行动状态,循环上面过程。 
    如果后手造一个2,先手补满m。无论后手让1+1=2还是让2+1=3,先手都能把造一堆4,其他都为1,循环上面过程。

    后手想构造 
    后手会把m造出来,此时又轮到先手,循环上面过程。 
    }

    当m为偶数 

    先手想构造 
    先手会直接把m造出来。后手会让1+1=2。此时等价于造出了一堆m,转化为后手想构造。

    后手想构造 
    后手造出m-1后,如果先手把它补成m,则等价于造出一堆m,转化为先手想构造。如果先手让1+1=2,则后手补出m。此时无论先手让2+1=3还是让1+1=2,后手都把它变为4。现在后手就能构造那一堆是偶数的了,等价于造出一堆m后,变成先手想构造。

    发现这两种是交替的 

    构造方法只有在m<=3的情况下不成立,这种情况就易于分析了吧。。

     1 #include<cstring>
     2 #include<cmath>
     3 #include<algorithm>
     4 #include<iostream>
     5 #include<cstdio>
     6 
     7 #define ll long long
     8 using namespace std;
     9 inline int read()
    10 {
    11     int x=0,f=1;char ch=getchar();
    12     while(ch>'9'||ch<'0'){if (ch=='-') f=-1;ch=getchar();}
    13     while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    14     return x*f;
    15 }
    16 int n,m,t,ans;
    17 int main()
    18 {
    19     int cas=read();
    20     while(cas--)
    21     {
    22         n=read(),m=read();
    23         t=n/m;
    24         if(n%m) t++;
    25         ans=n-t;
    26         if(ans%2) printf("0
    ");
    27         else printf("1
    ");
    28     }
    29 }
  • 相关阅读:
    Cookie的使用(二)
    对创业者有启发的10个故事
    PHP MySQL 相关函数
    异步刷新加载脚本(转载老赵)
    全栈工程师之路中级篇之小程序开发第二章第一节小程序的模板评分星星模板
    全栈工程师之路中级篇之小程序开发第二章第二节小程序电影卡片模板
    全栈工程师之路中级篇之小程序开发第一章第三节阅读官方demo
    全栈工程师之路中级篇之小程序开发第一章第五节从px到rpx
    全栈工程师之路中级篇之小程序开发第一章第二节注册小程序和开发工具讲解
    全栈工程师之路中级篇之小程序开发第一章第四节从block盒式布局到Flex弹性布局
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8119452.html
Copyright © 2011-2022 走看看