zoukankan      html  css  js  c++  java
  • hdu 3544 Alice's Game

    #include<stdio.h>
    int main()
    {
        int t,n;
        __int64 sum1,sum2;
        int i,j,a,b;
        scanf("%d",&t);
        for(i=1;i<=t;i++)
        {
            scanf("%d",&n);
            sum1=sum2=0;
            for(j=0;j<n;j++)
            {
                scanf("%d%d",&a,&b);
                while(a>1&&b>1)
                {
                    a>>=1;
                    b>>=1;
                }
                if(a>1)sum1+=a;
                else sum2+=b;
            }
            //printf("%d %d ",sum1,sum2);
            printf("Case %d: ",i);
            if(sum1>sum2)printf("Alice
    ");
            else printf("Bob
    ");
        }
    
        return 0;
    }

    这题是一个组合游戏,但是并不是一个对等的组合游戏,所以试图使用 SG 函数相关知
    识解答是会面临巨大的挑战的。 书中本题的做法描述得十分简单,当然对于有这类组合游戏
    知识的同学来说这题也确实十分简单,如果没有相关背景知识,也没有关系,我们来慢慢分
    析这道题目。
    要成功地解答本题需要认真地分析这个游戏的规则,我们首先来考虑一些简单情况。
    (1) 只有 n*1 和 1*m 的巧克力的时候
    (2) 2*2 的巧克力
    (3) 2*3 和 3*2 的巧克力
    (4) n*2 和 2*m 的巧克力
    (5) n*3 和 3*m 的巧克力
    (6) 很多巧克力在一起的情况
    我们来一个一个分析这些情况,对于 n*1 和 1*m 的巧克力,显然 n*1 的巧克力对 alice
    有利,而 1*m 的巧克力对 bob 有利。假设 n*1 对于 alice 有 n-1 的 HP 贡献,而 1*m 对于 bob
    有 m-1 的 HP 贡献。至于谁胜利?自然是谁 HP 多谁就胜利,当然考虑到先 alice 先扣 HP,
    所以如果 HP 一样多, alice 也输了。 为了方便,我们定义 alice 的 HP 为正, bob 的 HP 为负。
    于是这个局面就可以通过简单的加法获得总的 HP 了。
    那 2*2 的巧克力呢,认真分析就可以发现 2*2 在这个游戏中纯属幻觉! 谁也不愿意先拿
    他开刀,切一道送了对方两次切的机会,而自己却只切了一刀。于是我们可以说,2*2 的巧
    克力值 0 的 HP。
    同样 2*3 和 3*2 的巧克力也因为同样的道理就这么被无情地抛弃了。
    对于 n*2 的巧克力,根据直觉 alice 应该感到很高兴(当然不是 1*2), bob 自然不会傻
    到来切这个巧克力,于是 alice 自己要想办法自己尽量多切几刀, 注意到切出 1*2 的巧克力
    是很不利的事情,于是每次都切 2*2 的,可以切(n/2)-1 刀。 于是这就是 n*2 的巧克力的 HP
    贡献了。2*m 以及 n*3,3*m 的就不再赘述,都是一样。
    以此类推,4*4,8*8,16*16,都是比较关键的巧克力。
    弄一个表吧,再找不到规律„„


    好像,把这些 HP 值加起来,我们这题就做完了? Oh yeah.

    !!!!来自官方解题报告

  • 相关阅读:
    ASP.NET面试资料【六】
    让Google帮你托管AJAX库
    JavaScript:prototype属性使用说明【转】
    如何存储Session
    给HyperLink控件连接资源文件
    Atcoder Regular Contest 096 D Sweet Alchemy(贪心+多重背包)
    NOI2021 去不了记
    一个测试你的浏览器支持多少HTML5元素的网站
    json怎么读
    QT元件(QTableView、QSql*之类)的最好开在堆空间中用指针操作
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3372540.html
Copyright © 2011-2022 走看看