题意:编号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; }