[CSPS牛客集训营1 T1] 仓鼠的石子游戏

题目描述

仓鼠和兔子被禁止玩电脑,无聊的他们跑到一块空地上,空地上有许多小石子。兔子捡了很多石子,然后将石子摆成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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIGBIGPPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值