题意:编号1-n的盒子,当你的编号满足(是编号!编号!编号!) B<A && (A+B)%2=1 && (A+B)%3=0的时候你可以从a中取至少一个石头到b不能取的人输问你输赢。
思路:
借一下网上的图啊
由这里可以看出,只有1,3,4他们不能接着往后移动,也就是说所有的都归到了1,3,4,也就是说当你把卡片归到1,3,4,里面的时候,其实就是把石子堆中的石子给抽走了(因为已经没有办法在移动了),之后我们又可以看到只有i%6 ==0 || 2 || 5的时候他有奇数步到达汇点,其他的都是偶数步到达汇点,但是偶数步的情况我们可以不考虑,因为它可以想阶梯博弈里面的偶数台阶一样,如果你在偶数步里拿了一个,那么下一个人一定可以将他移动到下一个盒子里面去,所以我们只用考虑奇数步的就好了
上代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 10000+100;
int a[maxn];
int main()
{
int t;
scanf("%d",&t);
int Case = 0;
while(t--)
{
int n;
scanf("%d",&n);
for(int i = 1 ; i <= n ; i++)
{
scanf("%d",&a[i]);
}
int ans = 0 ;
for(int i = 1 ; i <= n ; i++)
{
if(i % 6 == 0 || i % 6 == 2 || i % 6 == 5)
{
ans = ans ^ a[i];
}
}
printf("Case %d: ",++Case);
if(ans)
{
puts("Alice");
}
else
{
puts("Bob");
}
}
return 0;
}