洛谷 P9586 游戏 的题解

题目大意

有三种手牌:杀、闪、斩。杀克斩,闪克杀。你知道两个人分别有多少杀、闪、斩,请问 在两人都进行最优策略的情况下 最终谁会赢。

大体思路

总评:思维中等,代码短,一道贪心好题。

读题就可以发现,斩就是老大,杀是老二,闪是老三。因为出斩永远是主动的,不可能是被动的;杀虽然有可能是主动的,但是也有可能是克制斩;闪就非常的被动了,出闪的唯一目的就是克制杀。

所以,考虑贪心,我们让小 C 先出斩,如果无法把对方杀死,就直接把回合转给对方。因为斩用光了也没有事,无论对方怎么出,都不用出斩来克制对方。而如果把杀和斩一次性都用完,如果对方出斩,就无法出牌回应,就输掉了。

小 D 也是这样操作。

如果一个轮回过去两人都没有输,那么就依次出杀。

为什么?因为两人的斩都出完了,就没有任何的牌对杀构成威胁。杀就是老大了。如果某个人杀的数量比另一个人的闪的数量大,那么这个人就赢了。

最后如果两人还是没有分出上下,那么表示两人都只剩下闪了。在两人都没有杀的情况下出闪就没有任何意义了,于是,答案就是平局。

代码如下:

#include <stdio.h>

inline int read() {
	int x = 0, f = 1; char ch = getchar();
	while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); }
	while(ch >= '0' && ch <= '9') { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); }
	return x * f;
}

int T, a1, b1, c1, a2, b2, c2;
int a[1000007];

//c 用 a 缓解
//a 用 b 缓解

int main() {
	T = read();
	while(T--) {
		a1 = read(), b1 = read(), c1 = read();
		a2 = read(), b2 = read(), c2 = read();
		if(c1 > a2 || a1 > b2) { printf("C\n"); continue; }
		a2 -= c1; c1 = 0; //小 C 用掉所有斩
		if(c2 > a1 || a2 > b1) { printf("D\n"); continue; }
		a1 -= c2; c2 = 0; //小 D 用掉所有斩
		if(a1 > b2) { printf("C\n"); continue; }
		if(a2 > b1) { printf("D\n"); continue; }
		printf("E\n");
	}
	return 0;
}
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值