【博弈论/思维题】人人尽说江南好

选自HEOI2014

BZOJ 3609: [Heoi2014]人人尽说江南好

  • 因为游戏规定,首先无法合并的一方判输, 每人都会使用最优策略, 那么贪心的想, 最优合并方案最后石子排布情况一定为m, m....m, n%m. 初始每堆石子都为一个, 所以这种情况是一定可以实现的
  • 所以只需要计算出合并成最终方案的步数, 若为奇数, 先手胜, 偶数, 后手胜。
  • sum = (n / m) * (m - 1) + (n % m) - 1;   //n/m堆(能正好凑成m个的石子堆数)
  • 因为每堆石子初始1个, 所以合并成一堆, 需要m-1次,最后剩下的n%m个, 合并成一堆也只需要(n%m)-1 次
  • 特殊判断, 若n能被m整除, 后面的{ (n%m) - 1}没有意义, 如果直接代式子, 还会多减去一, 所以分开计算
 1 /**************************************************************
 2     Problem: 3609
 3     User: Hwjia
 4     Language: C++
 5     Result: Accepted
 6     Time:0 ms
 7     Memory:1288 kb
 8 ****************************************************************/
 9  
10 #include<cstdio>
11 #include<iostream>
12 using namespace std;
13 int T, n, m;
14 int main() {
15     scanf("%d", &T);
16     while(T--) {
17         scanf("%d%d", &n, &m);
18         int tot = (n / m) * (m - 1);
19         if(n % m != 0) tot += (n % m) - 1;
20         if(tot & 1) printf("0
");
21         else printf("1
");
22     }
23     return 0;
24 }

0ms!!

短小精悍的代码qwq

但是它胜在妙啊QuQ!

原文地址:https://www.cnblogs.com/Hwjia/p/9854296.html