题目
传送门 P8606 [蓝桥杯 2013 国 B] 高僧斗法 - 洛谷
思路
这个题就比较考验博弈的基本题型和转换能力了;
这个题是nim博弈=>阶梯博弈
再将小和尚的移动转化为阶梯上石子的移动:两个小和尚之间可以移动的距离,看做阶梯上的石子,小和尚右移==相邻阶梯上石子的转移
将所有距离转化为阶梯,看奇数位置的nim和是否为0,为0--无解,不为零--找一个合法的解:让找最小的A且数据较小,即从小到大枚举小和尚向右移动的位置
代码
LL n;
vector<LL> a;vector<LL> b;bool check()//计算阶梯博弈的 nim和
{ LL res = 0;for (int i = 0;i < n - 1;i += 2){res ^= b[i];}return res;
}void solve()
{LL x;while(cin >> x)//小和尚的距离{a.push_back(x);}n = a.size();for (int i = 0;i < n - 1;i ++)//转化为阶梯上的石子{b.push_back(a[i + 1] - a[i] - 1);}if (!check()) {cout << -1 << endl;}else{for (int i = 0;i < n - 1;i ++)//从小到大枚举小和尚for (int j = 1;j <= a[i + 1] - a[i] - 1;j ++)//右移的距离{//模拟小和尚右移后对之间距离(台阶石子)的影响b[i] -= j;if (i) b[i - 1] += j;//如果是第一个,左边没有台阶,不用加if (!check())//先手操作完后,检查是否满足必胜要求{cout << a[i] << " " << a[i] + j << endl;return;}//还原b[i] += j;if (i) b[i - 1] -= j;}}
}