蓝桥杯——高僧斗法(博弈)

题目:

在这里插入图片描述

输入输出:

在这里插入图片描述

分析:

此题属于博弈中的Nim博弈,我们分析一下小和尚所处的位置可发现这样一种状况:假设下标从1开始,不管偶数位的小和尚如何移动,位于此偶数位之前的一个小和尚必能移动相同的步数,使其与偶数位的小和尚的距离保持不变,那么我们就可以将所有的小和尚两两组合,比如说有 a1 a2 a3 a4 a5共5个和尚,可以分为(a1,a2),(a3,a4),a5,因为a2 a4不管如何移动,a1和a3总能移动相同的步数,此时先手只要令组合之间的异或为0即可获得胜利,此时就转化为了普通的Nim游戏。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

const int MAXN = 105;
int num[MAXN],ind;
int nim[MAXN],indx,sum;

int main()
{
    while(cin >> num[++ind])
        if(cin.get()=='\n') break;
    sort(num+1,num+ind+1);
    for(int i=1;i<ind;i++)
        nim[i] = num[i+1] - num[i]-1;
    for(int i=1;i<ind;i+=2)
        sum^=nim[i];
    if(sum == 0)
    {
        printf("-1\n");
        return 0;
    }
    for(int i=1;i<ind;++i)
        for(int j=1;num[i]+j<num[i+1];++j)
        {
            sum = 0;
            nim[i] -= j;
            nim[i-1] += j;
            for(int k=1;k<ind;k+=2)
                sum^=nim[k];
            if(sum == 0)
            {
                printf("%d %d\n",num[i],num[i]+j);
                return 0;
            }
            nim[i] += j;
            nim[i-1] -= j;
        }
    return 0;
}

发布了61 篇原创文章 · 获赞 7 · 访问量 3636

猜你喜欢

转载自blog.csdn.net/weixin_42469716/article/details/104614010