题目大意
有三种手牌:杀、闪、斩。杀克斩,闪克杀。你知道两个人分别有多少杀、闪、斩,请问 在两人都进行最优策略的情况下 最终谁会赢。
大体思路
总评:思维中等,代码短,一道贪心好题。
读题就可以发现,斩就是老大,杀是老二,闪是老三。因为出斩永远是主动的,不可能是被动的;杀虽然有可能是主动的,但是也有可能是克制斩;闪就非常的被动了,出闪的唯一目的就是克制杀。
所以,考虑贪心,我们让小 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;
}