又是个我好像没学过的博弈。。。
阶梯博弈是这样的:游戏开始时有许多硬币任意分布在楼梯上,从地面由下向上编号为0到n。 游戏者在每次操作时可以将楼梯j(1≤j≤n)上的任意多但至少一个硬币移动到楼梯j-1上。 游戏者轮流操作,将最后一枚硬币移至地上的人获胜。
这道题就把两个棋子之间的空间看作一个阶梯上的硬币,这个阶梯是左高右低的,向左移动棋子相当于空格向右,把硬币向下送
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int a[11000]; int len,s[11000]; int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); sort(a+1,a+n+1); len=0;a[0]=0; for(int i=n;i>=1;i--)s[++len]=a[i]-a[i-1]-1; int ans=0; for(int i=1;i<=len;i++) if(i%2==1)ans^=s[i]; if(ans==0)printf("Bob will win "); else printf("Georgia will win "); } return 0; }