Luogu P10507 Georgia and Bob 题解
这篇题解的注重点不是结论的证明,而是发现结论的思路,所以比较偏感性。证明人人都会,而发现结论的思路才是这题真正值得思考的地方。
感觉这道题不知道阶梯 NIM 自己推出来也不难,在这个建模下思路挺顺的。感觉讲解阶梯 NIM 可以采用这个模型。
显然的博弈论题目,但是局面不好表示,这种情况经典的转化是寻找一个可以刻画局面的特殊量。
考虑到每一次移动棋子只与它与它的前驱之间的距离有关,因此不难想到本题刻画局面的特殊量与相邻元素的差分有关。于是,我们在差分数组上进行分析。
我们又想到,如果先手某一次移动了某一个棋子,那么后手一定可以把这个棋子的后继棋子移动相同的距离。而这个时候,除了这个棋子与这个棋子的后继棋子的后继棋子的差分,其余的差分值是都没有改变的。不考虑这两个棋子的改变,这种操作就是无意义的,因为它什么都没有改变。而且这种情况下后手一定可以这么操作,因为不劣。我们希望构造一个特征量这种操作无意义,因为可以简化局面。
我们再来考虑改变的两个棋子有什么性质。我们发现这两个棋子的排名奇偶性相同,这引导我们思考把棋子按照排名奇偶性分类。再结合希望可以使这种操作无意义,我们希望能构造出一种刻画局面的方式使排名为奇数或者偶数的棋子的差分在某一次操作中的改变可以被忽略。
注意到希望可以被忽略改变的棋子正好也是被先手操作的棋子,而先手又不会操作这些棋子,因为这种操作是无意义的,不优。那我们为什么不直接在局面中删去奇数或偶数棋子中一个的差分呢?
由于最后一个棋子的影响不能忽略,那我们选取从后往前排名为偶数的棋子的差分忽略。这样,每一次操作只能对奇数棋子操作。如果对偶数棋子操作,后手可以立刻对后继棋子进行相同的操作。由于这个棋子与这个棋子的后继棋子的后继棋子都是偶数,它们差分的改变刚好可以被忽略。于是,我们只使用奇数棋子的差分刻画了状态。
最后,再来考虑奇数棋子怎么拿。我们发现在它的差分减一范围内可以随便取多少,因为不会超过上一个偶数棋子。因此,奇数棋子就相当于 NIM 游戏里的一堆石子,这一堆里共有它的差分减一个石子。至此,我们成功将问题转化为了经典的 NIM 博弈问题。
想看理性证明的可以去看别的题解,写的绝对比我这个胡说八道的感性理解好。
#include <bits/stdc++.h>
using namespace std;
long long t,n,a[10000];
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+n+1);
long long sum=0;
for(int i=n;i>=1;i-=2)sum^=(a[i]-a[i-1]-1);
if(sum)printf("Georgia will win\n");
else printf("Bob will win\n");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探