题目:
输入输出:
分析:
此题属于博弈中的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;
}