zoukankan      html  css  js  c++  java
  • Luogu P4101 【[HEOI2014]人人尽说江南好 】

    Description

    传送门


    Solution

    如果每个人每次都只是将一个大小为(1)的石子堆放到当前最大的石子堆里,那么当游戏不能玩的时候局面必定是有(n / m)个大小为(m)的石子堆和(left [ n mod m eq 0 ight ])个大小为(n mod m)的石子堆。

    一共需要(left ( m - 1 ight ) imes left (n / m ight ) + left[ n mod m eq 0 ight ] imes left ( n mod m - 1 ight ))步达到最后的局面。

    如果都按照这样的策略进行游戏,那么如果步数是奇数就是先手胜否则是后手胜利。但是现在还有别的决策可以执行,而且最终局面不是唯一的,但是可以采用一种策略使最终局面就是这样的。考虑如果按这个策略进行游戏本来是先手必胜那么当后手执行决策时有两种可能。

    第一种将一个大小为(1)的石子堆和最大的石子堆合并,这样先手只要继续执行策略最后就能获胜。

    第二种将两个大小为(1)的石子堆合并,这样先手下次只要将这个大小为(2)的石子堆和最大的合并就行,和上面的第一种情况一样都是得到一个最大的石子堆和一些大小为(1)的石子堆。

    如果不能合就直接拿一个大小为(1)的石子堆和最大的合并就行,和上面第一种情况得到的局面还是一样的,都是一个大小为(m)的石子堆和一个大小为(2)的石子堆还有一些大小为(1)的石子堆。

    所以无论是那种决策达到最终局面的步数不变,依然是先手必胜。如果一开始算的步数是后手必胜同理。

    所以按这种决策计算的步数是奇数就是先手胜否则就是后手胜。


    Code

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    int n, m;
    
    int main()
    {
    	int t;
    	scanf("%d", &t);
    	while (t--)
    	{
    		scanf("%d%d", &n, &m);
    		printf("%d
    ", (n - (n / m) + (n % m != 0)) % 2 == 0 ? 1 : 0);
    	}
    	return 0;
    } 
    
  • 相关阅读:
    JS中this指向问题(const self = this)
    nuxt.js中koa2写接口顺序
    关于Vue中的slot-scope="scope"
    Nuxt.js 中设置 div的css的 height 为100%
    nuxt报错:[nuxt] store/index.js should export a method that returns a Vuex instance.
    解决element UI中当value初始值存在空值时select只显示初始值,不显示placeholder值
    CSS控制一行显示两个li
    原生JS实现列表子元素顺序反转的方法分析
    Javascript 字符串全排列组合方法实现
    mysql引擎
  • 原文地址:https://www.cnblogs.com/Tian-Xing-Sakura/p/13097811.html
Copyright © 2011-2022 走看看