• ARC072 D Alice&Brown 博弈论


    ~~~题面~~~

    题解:

      题目大意:有2堆石子数分别为x, y的石子,你每次可以从中间的某一堆中取出2i个石子,扔掉i个,并把剩下的i个放到另一堆,无法操作的人就输了。

      现在给定x,y,判断先手必赢还是先手必输。

      表示这题推出了一个性质,,,然后,,,就没有然后了。

      看题解还是比较妙的。

      结论:如果$|x - y| <= 1$那么后手必赢,反之先手必赢。

      证明:

        假设现在有$|x - y| le 1$,我们不妨设$x > y$,那么$y = x - k$.所以如果我们从x中拿出2i个石子,那么x,y将变为:

        $x' = x - 2i$   $y' = x - k + i$

        这时我们可以发现$y' - x' = -k + 3i$,因为i是非负的,而k因为$|x - y| le 1$,所以$k le 1$,所以3i的大小至少为3,而k最大为1,所以$y' - x'$至少为2,那么这个时候后手一定可以移动。

        现在来考虑后手怎么动:

        首先我们可以推出一个性质,当一开始的石子数为x , y时,先手取了一步变成了$x - 2i$和$y + i$,这个时候后手只需要从y中拿同样的2i个,就可以使得石子数变为$x - i$和$y - i$,而我们知道,两个数同时减去同一个数,它们的差是不会变化的,所以这个时候的$x'$和$y'$依然相差小于等于1,这就转化成了第一种情况

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define R register int
     4 #define LL long long
     5 
     6 LL x, y;
     7 void work()
     8 {
     9     scanf("%lld%lld", &x, &y);
    10     if(abs(x - y) <= 1) printf("Brown
    ");
    11     else printf("Alice
    "); 
    12 }
    13 
    14 int main()
    15 {
    16     freopen("in.in", "r", stdin);
    17     work();
    18     fclose(stdin);
    19     return 0;
    20 }
    View Code
  • 相关阅读:
    Linux下让一个程序开机自动启动
    Heartbeat高可用解决方案
    NFS文件共享
    清除系统日志的三个脚本
    nfs+rsync+inotify实现文件的实时同步
    安装配置rsync服务端
    shell中如何进行算术运算
    linux下查看账号密码的过期时间和设置时间
    配置Nginx作为web server详解
    [LeetCode] 398. Random Pick Index ☆☆☆
  • 原文地址:https://www.cnblogs.com/ww3113306/p/9819252.html
Copyright © 2020-2023  润新知