题目描述
仓鼠和兔子被禁止玩电脑,无聊的他们跑到一块空地上,空地上有许多小石子。兔子捡了很多石子,然后将石子摆成n个圈,每个圈由a[i]个石子组成。然后兔子有两根彩色笔,一支红色一支蓝色。兔子和仓鼠轮流选择一个没有上色的石子涂上颜色,兔子每次可以选择一个还未染色的石子将其染成红色,而仓鼠每次可以选择一个还未染色的石子将其染成蓝色,并且仓鼠和兔子约定,轮流染色的过程中不能出现相邻石子同色,谁不能操作他就输了。假设他们两个都使用了最优策略来玩这个游戏,并且兔子先手,最终谁会赢得游戏?
输入描述:
第一行输入一个正整数T,表示有T组测试案例。
每组测试案例的第一行输入一个n,表示有n圈石子。 第二行输入n个正整数a[i],表示每个圈的石子数量。
输出描述:
对于每组测试案例,如果兔子赢了,输出”rabbit“(不含引号)如果仓鼠赢了,输出"hamster"(不含引号)。
示例1
输入
4
1
3
1
1
2
1 3
3
999 1000 1000000000
输出
hamster
rabbit
rabbit
hamster
说明
对于第一组案例:只有1圈石子,并且石圈的大小为3。
兔子先手,随便找了一个石子染成红色,接下来仓鼠后手找一个未染色的石子染成蓝色,此时结果如下图所示。
如果兔子将最后一个石子染成红色,这将导致相邻石子同色,根据规则,他输掉了比赛,所以仓鼠获得了最终的胜利。
对于第二组案例:只有1圈石子,并且石圈的大小为1。
兔子先手,将唯一的一个石子染成了红色,接下来由于没有未着色的石子,所以仓鼠由于无法操作而输掉了比赛,兔子取得了最终的胜利。
对于第三组案例:有两个石圈,大小分别为1,3,兔子首先将大小为1的石圈中唯一一个石子染成了红色,接下来仓鼠由于类似第一组案例中的原因输掉比赛,兔子取得了最终的胜利。
这道题本来是猜出来了,当时考试的时候比较懵,老师刚开始说不忽略多余换行,然后就手动判断换行,
最重要的是还判断错了…
考出来没成绩以为是自己推错了,把2也当先手必胜了,结果第二天来看原代码的时候发现自己的判断是if(a[i] < 2) 没判错,
然后又去手调样例,调着调着发现觉着有点怪怪的,怎么倒数第二个怎么老是没有换行
然后想了想牛客评测应该是忽略多余换行的,然后直接全换行交了一下。
就过了…
这道题手推可以发现一堆石子的情况下,只有在大小是1的时候是先手必胜,其他情况都是先手必输,我推到了大小为7的情况,那么我就可以合理推测出这个结论。
同时我们思考多堆的情况,在先手必输的情况下,完成一堆后先手的人不变,只有在遇到石堆大小为1的时候先手的人才会交换,并且交换胜负者,那么我们模拟一下就可以了。
当然,机房的大佬有用异或做的方法,
没脑子,不去想了。
C
o
d
e
Code
Code
#include<bits/stdc++.h>
using namespace std;
int a[1001];
int n, t;
int main()
{
scanf("%d", &t);
while(t--){
memset(a, 0, sizeof(a));
scanf("%d", &n);
int win = 0, p = 1;
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
if(a[i] > 1){
if(p == 1) win = 2;
else win = 1;
}
if(a[i] == 1){
if(p == 1) p = 2, win = 1;
else {
p = 1, win = 2;
}
}
}
if(win == 1){
printf("rabbit\n");
}
else printf("hamster\n");
}
return 0;
}