HDU 4315 Climbing the Hill (尼姆博弈)

Posted Ritchie丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4315 Climbing the Hill (尼姆博弈)相关的知识,希望对你有一定的参考价值。

Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u

 Status

Description

Alice and Bob are playing a game called "Climbing the Hill". The game board consists of cells arranged vertically, as the figure below, while the top cell indicates the top of hill. There are several persons at different cells, and there is one special people, that is, the king. Two persons can‘t occupy the same cell, except the hilltop. 

At one move, the player can choose any person, who is not at the hilltop, to climb up any number of cells. But the person can‘t jump over another one which is 
above him. Alice and Bob move the persons alternatively, and the player who move the king to the hilltop will win. 

技术分享


Alice always move first. Assume they play optimally. Who will win the game? 
 

Input

There are several test cases. The first line of each test case contains two integers N and k (1 <= N <= 1000, 1 <= k <= N), indicating that there are N persons on the 
hill, and the king is the k-th nearest to the top. N different positive integers followed in the second line, indicating the positions of all persons. (The hilltop is No.0 cell, the cell below is No.1, and so on.) These N integers are ordered increasingly, more than 0 and less than 100000.
 

Output

If Alice can win, output "Alice". If not, output "Bob".
 

Sample Input

3 3 1 2 4 2 1 100 200
 

Sample Output

Bob Alice

Hint

 The figure illustrates the first test case. The gray cell indicates the hilltop. The circles indicate the persons, while the red one indicates the king. The first player Alice can move the person on cell 1 or cell 4 one step up, but it is not allowed to move the person on cell 2. 

题意:在山上有n个人,每个人编号是1~n,这些位置只能同时被一个人占据,但是山顶可以同时被多个人占据,距离山顶第k近的是King,现在Alice和Bob开始向上
          送人,条件是不能跨越前面最近的人,问在Alice先手,双方最优的条件下谁能把King送到山顶。

题解:这个题是2012多校第二场的题目,也是2011年大连站regional热身赛的题目。

          阶梯博弈的变种,是尼姆博弈。

          对于这个题目:当k=1时,Alice必胜;

                               当k!=1时,两两分组,如果前面只有一个球即n为奇数且k=2时,Alice和Bob都不愿移动前面的球到0,所以此时前面球有hill[1]-1种
                               选择,所以hill[1]--。

注意本题与poj1704的区别。

poj 1704 是每一个点看成一个堆,因为没山顶,每个点相对于前一个点运动,一共有n堆,只异或奇数堆,是阶梯博弈。

本题是每两个点看成一个堆,n=1和k=2要单独讨论,每两个点相对于山顶运动,注意移动的时候山顶永远都算一个空格,异或所有堆,是尼姆博弈。

这个问题是谁能掌握主动权让对面去面对0的事,与k在组内前后无关。

1.假设n=5,k=2。1, 2,5, 6,10。 三堆是0,2,3。先手必胜。先手走成0,2,2让后手面对必败态,后手可以把局面走成0,0,0。

最后最后后手只能选择把第一个数走到0,先手把2移动到0胜。

2.假设n=5,k=4。1,2,5,6,10。三堆是1,2,3。异或为0先手必败。注意这组数据1是可以走到0的上组数据不可以。

3.假设n=4,k=2。1,3,4,7。两堆是1,2。异或不为0先手必胜。先手走成1,1即可。

注意当第一个数1走到0的时候,第二个数3走到的是2而不是1也不是0,1走到了0,3走到了2,中间距离还是1。

即相对运动不改变该堆的值,一定要注意3走到的是2而不是1也不是0。

#include <iostream>
#include <algorithm>
using namespace std;
void pr(int ans)
{
    if(ans)
        cout<<"Alice"<<endl;
    else
        cout<<"Bob"<<endl;
}
int main()
{
    int n,k;
    while(cin>>n>>k)
    {
        int a[1005],ans=0;
        for(int i=1; i<=n; i++)
            cin>>a[i];
        a[0]=0;
        if(k==1)
        {
            cout<<"Alice"<<endl;
            continue;
        }
        if(k!=2) a[0]=-1; //只有当n为奇数的时候才会涉及到a[0] 因为a[1]单成一堆 
        //意为正常0到a[1]这个堆就应该是a[1]-1的 但是k不在2的时候a[1]可以移动到0
        //比正常的堆多一个位置 所以要-(-1)=+1
        for(int i=n; i>=1; i-=2)
            ans=ans^(a[i]-a[i-1]-1);
        pr(ans);
    }
    return 0;
}

 

 

以上是关于HDU 4315 Climbing the Hill (尼姆博弈)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 4315:Climbing the Hill(阶梯博弈)

HDU 4315 Climbing the Hill [阶梯Nim]

HDU 4315 阶梯博弈变形

HDU1049 Climbing Worm

基于Excel的HIL自动化测试工具VIAutoHIL

BZOJ1665 Usaco2006 Open The Climbing Wall