POJ1704 Georgia and Bob 题解 阶梯博弈

题目链接:http://poj.org/problem?id=1704

解题思路:

将两个相邻石子看成一组,每一组中前一个和后一个的距离等效成NIM博弈中石子个数(相邻两组之间距离无影响),这样就实现了到NIM博弈的转化,之后可以用NIM的异或规则进行博弈,需要注意的是石子不一定是偶数堆,如果是奇数堆则直接将第一组设为最左边一个元素,同时设其NIM值为其可移动范围即可。

示例代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1010;
int T, n, a[maxn], s;
int main() {
    scanf("%d", &T);
    while (T --) {
        scanf("%d", &n);
        for (int i = 0; i < n; i ++) scanf("%d", a+i);
        sort(a, a+n);
        s = (n % 2) ? a[0] - 1 : 0;
        for (int i = n%2; i < n; i += 2)
            s ^= a[i+1] - a[i] - 1;
        puts(s ? "Georgia will win" : "Bob will win");
    }
    return 0;
}

参考资料:

posted @ 2020-12-03 15:08  quanjun  阅读(80)  评论(0编辑  收藏  举报