HDU 3389 Game【阶梯博弈】

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3389

题意:

n 个盒子,编号1n排列,每个盒子都有若干卡片,每次对于满足 B<A(A+B)%2=1(A+B)%3=0 的两个盒子,可以将 A 中任意数目的卡片移到B中,两人轮流操作,问最后谁无法操作?

分析:

首先手算一下小数据,我们会发现最终盒子都的卡片都会落进编号为 1,3,4 的盒子中, 1,3,4 中的卡片无法再进行转移,而除以 6 余数为0,2,5的需要奇数步转移到 1,3,4 中,其余则需要偶数步。
类似阶梯博弈,偶数步的情况,先手移动一定数量卡片,那么后手可以完全模仿先手,将这些卡片继续前移,最后肯定是后手赢。
其实也只有奇数步的情况会影响答案,将奇数步位置的卡片拿走,放到的必是偶数步的位置,此时这些卡片不再影响胜负,所以可以将操作看成单纯的从奇数步位置拿走一定数量卡片,即转化为NIM游戏。将奇数步位置卡片数异或一下即可。

代码:

/*************************************************************************
    > File Name: 3389.cpp
    > Author: jiangyuzhu
    > Mail: 834138558@qq.com 
    > Created Time: 2016/7/31 14:04:29
 ************************************************************************/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
int main (void)
{
    int T;scanf("%d", &T);
    for(int tt = 1; tt <= T; tt++){
        int n;scanf("%d", &n);
        int ans = 0;
        int x;
        for(int i = 1; i <= n; i++){
            scanf("%d", &x);
            if(i % 6 == 0 || i % 6 == 2 || i % 6 == 5) ans ^= x;
        }
        printf("Case %d: ", tt);
        if(ans) puts("Alice");
        else puts("Bob");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值