zoukankan      html  css  js  c++  java
  • BZOJ3609 Heoi2014 人人尽说江南好【推理+结论】

    BZOJ3609 Heoi2014 人人尽说江南好


    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


    只需要明白可能获胜的一方一定会想方设法把最后的状态变成n/mmn%m就好了,事实证明这样的情况是一定成立的,所以我们直接统计最后的块数然后计算需要操作的次数就好了


     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 void solve(){
     4   int n,m;
     5   scanf("%d%d",&n,&m);
     6   int t=n-n/m;
     7   if(n%m)t++;
     8   if(t&1)printf("0
    ");
     9   else printf("1
    ");
    10 }
    11 int main(){
    12   int T;scanf("%d",&T);
    13   while(T--)solve();
    14   return 0;
    15 }
  • 相关阅读:
    初步掌握Yarn的架构及原理(转)
    CORS 专题
    WebSocket是一种协议
    InputStream中read()与read(byte[] b)(转)
    listview异步加载sd卡图片
    ListView getView中放置多个item和getItemViewType的用法
    Android ListView异步加载数据
    android sqlite 一次创建多个表
    Android Adapter的getViewTypeCount和getItemViewType
    Android 获取SDCard上图片和视频的缩略图
  • 原文地址:https://www.cnblogs.com/dream-maker-yk/p/9676246.html
Copyright © 2011-2022 走看看