题解 P4136 【谁能赢呢?】

cstdios

2020-02-13 18:53:56

Solution

## 前言 一开始看到这道题目的时候,以为是一道模拟,结果看数据范围, $o \big( n^2 \big)$肯定是过不了的,更何况还有神奇的多组数据。 ## 分析 于是,我就开始思考。那么在图画上模拟一遍吧! A 代表 小明 ,B 代表 小红 ,图画的可能不太好,还请各位大佬谅解,首先模拟一下 $2 \times 2$的格子吧。 ![](http://cstdios.cf/tc/data/QQ%E5%9B%BE%E7%89%8720200211105000.png) 石头,s 代表石头在左上角: ![1LJzAU.png](https://s2.ax1x.com/2020/02/13/1LJzAU.png) 然后开始搬石头,小明先来: ![1LYaCQ.png](https://s2.ax1x.com/2020/02/13/1LYaCQ.png) 小明选择搬到了 1,1 的地方,由于是每个人都会最优策略所以小红: ![1LY5K1.png](https://s2.ax1x.com/2020/02/13/1LY5K1.png) 然后又是小明: ![1Ltrzd.png](https://s2.ax1x.com/2020/02/13/1Ltrzd.png) 很显而易见,小明赢了! 那么我们来分析一下。 小明走一步,小红走一步,然后又是小明走一步。 石头也占一个格子。 你发现了吗?$n \times n -1$ 如果是个奇数那么就是小明到最后一格,也就是小红输了。 如果是个偶数那么就是小红到最后一格,也就是小明输了。 先别急着写代码,因为还可以优化。 $n \times n -1$ 如果是奇数那么就是小红输了,也就是 $n \times n$ 如果是偶数那么就是小红输了。 我们可以根据某个定理知道,$n \times n$ 和 $n$ 的奇偶性不变,所以可以得出: **如果 n 是偶数那么小明赢,反之就是小红赢了!** 结论得出来了,代码就很好写了。 ## 代码 ```cpp #include <iostream> #include <cstdio> using namespace std; int n; //定义变量+头文件,不说了。 int main() { n=1;//这里非常要注意,n必须有个值否则进入不了循环。 while (n)//循环开始 { scanf("%d",&n); if (n==0) break;//如果n=0那么退出 if (n%2==0) printf("Alice\n"); else printf("Bob\n");//这个判断看上面的结论 } return 0; } ``` ## 写在后面的话 我这篇题解如果有错误,那么请在评论区里留言,我将会很感谢反映的人。 最后,宣传一下我的两个blog [洛谷的](https://www.luogu.com.cn/blog/dgt/solution-p4136),[自己的](http://localhost:4000/uncategorized/solution-p4136/),记得来玩哦! **谢谢观赏!**