题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3389
题意:
n
个盒子,编号
分析:
首先手算一下小数据,我们会发现最终盒子都的卡片都会落进编号为
1,3,4
的盒子中,
1,3,4
中的卡片无法再进行转移,而除以
6
余数为
类似阶梯博弈,偶数步的情况,先手移动一定数量卡片,那么后手可以完全模仿先手,将这些卡片继续前移,最后肯定是后手赢。
其实也只有奇数步的情况会影响答案,将奇数步位置的卡片拿走,放到的必是偶数步的位置,此时这些卡片不再影响胜负,所以可以将操作看成单纯的从奇数步位置拿走一定数量卡片,即转化为NIM游戏。将奇数步位置卡片数异或一下即可。
代码:
/*************************************************************************
> File Name: 3389.cpp
> Author: jiangyuzhu
> Mail: 834138558@qq.com
> Created Time: 2016/7/31 14:04:29
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
int main (void)
{
int T;scanf("%d", &T);
for(int tt = 1; tt <= T; tt++){
int n;scanf("%d", &n);
int ans = 0;
int x;
for(int i = 1; i <= n; i++){
scanf("%d", &x);
if(i % 6 == 0 || i % 6 == 2 || i % 6 == 5) ans ^= x;
}
printf("Case %d: ", tt);
if(ans) puts("Alice");
else puts("Bob");
}
return 0;
}