POJ

阶梯博弈:

阶梯博弈:博弈在阶梯上进行,每次可以将一堆的若干式子移动到上一阶去,不可操作者输。

忽略所有的偶数阶梯,只留下奇数阶梯,转化为普通的NimNim游戏。大致的思路是这样的:首先终止状态一定是所有石子都在00号阶梯,即一个偶数阶梯。那么如果对方移动了一个偶数阶梯上的石子,那么你可以在移动结束的那个奇数阶梯,直接把等数量的石子继续向前移动,这样子可以保证偶数阶梯上的石子对于结果没有任何影响。那么如果移动的是一个奇数阶梯,因为偶数阶梯是没有影响的,所以你可以认为移动奇数阶梯就是直接被移走了,那么这就是一个普通的NimNim游戏了。

把每两个相邻棋子之间的距离当作是石子 则变为阶梯博弈。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<set>
#include<vector>

//睿智OJ头文件
using namespace std;
int a[1005];
bool cmp(int a, int b)
{
    return a > b;
}
int main()
{
    int T;
    cin >> T;
    while (T--) {
        int n;
        cin >> n;
        int now = 0;
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
        }
        sort(a + 1, a + 1 + n, cmp);
        a[n + 1] = 0;
        for (int i = 1; i <= n; i += 2) {
            now ^= a[i] - a[i + 1] - 1;
        }
        puts(!now ? "Bob will win" : "Georgia will win");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Aragaki/p/11502591.html