zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    PTA天梯赛L2
    图论-最短路算法
    配置自己的sublime
    testNG常用用法总结
    testng.xml文件的配置
    阿里云服务器 ECS Jenkins 安装教程
    jenkins报错:Problem accessing /jenkins/. Reason: HTTP ERROR 404
    jenkins安装详细教程
    jenkins下载插件无插件显示+离线下载插件方法
    如何让junit的测试跑多次
  • 原文地址:https://www.cnblogs.com/ww3113306/p/9819252.html
Copyright © 2011-2022 走看看