zoukankan      html  css  js  c++  java
  • 【hdu 3951】Coin Game

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1851 Accepted Submission(s): 1065

    Problem Description
    After hh has learned how to play Nim game, he begins to try another coin game which seems much easier.

    The game goes like this:
    Two players start the game with a circle of n coins.
    They take coins from the circle in turn and every time they could take 1~K continuous coins.
    (imagining that ten coins numbered from 1 to 10 and K equal to 3, since 1 and 10 are continuous, you could take away the continuous 10 , 1 , 2 , but if 2 was taken away, you couldn’t take 1, 3, 4, because 1 and 3 aren’t continuous)
    The player who takes the last coin wins the game.
    Suppose that those two players always take the best moves and never make mistakes.
    Your job is to find out who will definitely win the game.

    Input
    The first line is a number T(1<=T<=100), represents the number of case. The next T blocks follow each indicates a case.
    Each case contains two integers N(3<=N<=109,1<=K<=10).

    Output
    For each case, output the number of case and the winner “first” or “second”.(as shown in the sample output)

    Sample Input
    2
    3 1
    3 2

    Sample Output
    Case 1: first
    Case 2: second

    【题目链接】:http://acm.hdu.edu.cn/showproblem.php?pid=3951

    【题解】

    会发现如果k!=1
    先手不管怎样选一段;
    我们总能在这n个硬币所围成的对角线上选取同样的一段(或者比它多一个或少一个->n为奇数的情况);这样就分成了两段硬币;
    这两段硬币的个数相同;
    ->如果对应两个游戏的话,对应的sg函数必然是相同的;
    则sg[x]^sg[x]==0
    所以先手输;
    我们总能让第一个人面对这种情况;
    所以第一个人总是输的;
    但是k=1的时候就不一定可以;
    只有当n为偶数的时候第一个人输;n为奇数的话第一个人无论如何都会赢的.

    【完整代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define rei(x) scanf("%d",&x)
    #define rel(x) scanf("%I64d",&x)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    //const int MAXN = x;
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    
    int T;
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        rei(T);
        rep1(ii,1,T)
        {
            int n,k;
            rei(n);rei(k);
            printf("Case %d: ",ii);
            if (k>=n || (k==1 && n&1))
                puts("first");
            else
                puts("second");
        }
        return 0;
    }
    
  • 相关阅读:
    Redis存储对象(序列化和反序列化)
    JAVA中关于set()和get()方法的理解以及使用
    5W1H分析法
    Spring AOP的理解(通俗易懂)。
    Notepad++ 使用步骤,熟练掌握notepad++的使用技巧,无疑会大大提升专业技能。以及快捷键操作
    Int,String,Integer,double之间的类型的相互转换
    Ajax局部刷新和全局刷新的区别
    GET和POST都是什么时候用?
    ajax为什么需要json格式响应数据?
    final fially finalize区别
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626730.html
Copyright © 2011-2022 走看看