Loading

HDU-3389 Game

Game

两个人互相博弈,每次轮流操作,给出 \(n\) 个盒子,每个盒子中有0个或若干个石头,编号为 \(1\)\(n\),每次操作可以选取一个非空盒子 A 和一个盒子 B,要求 B < A 且 (A+B) % 2 == 1 且 (A+B) % 3 == 0,并将A中的任意数量的石子放到B中,至少放一个。如果不能进行该操作则该玩家输

阶梯博弈

先通过构建有向边,发现 1,3,4 号盒子没有办法再进行转移,所以最后所有的石子都会集中到 1,3,4 号盒子中

接着通过观察发现,盒子的号数转移是有规律的,x % 6 == 1 号盒子必然只能转移到 x % 6 == 2,且 x % 6 == 2 号盒子必然只能转移到 x % 6 == 1

同理 x % 6 == 0 和 x % 6 == 3, x % 6 == 5 和 x % 6 == 4

这样我们就会发现,无论怎么转移,x % 6 == 1, x % 6 == 3, x % 6 == 4 的盒子,转移到最终盒子都是要经过偶数步

x % 6 == 2, x % 6 == 0, x % 6 == 5 的盒子,转移到最终盒子都是要经过奇数步

根据阶梯博弈的原则,我们可以理解为偶数步无用(走一步成为奇数步后,后手可以继续走,将其转移为偶数步),奇数步符合尼姆博弈

#include <iostream>
using namespace std;

int main()
{
    int t;
    cin >> t;
    for(int k=1; k<=t; k++)
    {
        int n;
        cin >> n;
        int sum = 0;
        for(int i=1; i<=n; i++)
        {
            int x;
            cin >> x;
            if(i % 6 == 2 || i % 6 == 0 || i % 6 == 5)
                sum ^= x;
        }
        cout << "Case " << k << ": ";
        if(sum) cout << "Alice" << endl;
        else cout << "Bob" << endl;
    }
    return 0;
}
posted @ 2022-04-28 21:48  dgsvygd  阅读(18)  评论(0编辑  收藏  举报