1 条题解
-
0
题目分析
本题是一个双人博弈问题,双方各自拥有本体生命值和骑士生命值。游戏按回合交替进行,奇数回合由水母的骑士行动,偶数回合由花花的骑士行动。每个骑士在回合中可以选择攻击对方本体或对方骑士,攻击使目标生命值减少 。当一方本体生命值 时,该方立即失败;当一方骑士生命值 时,该骑士死亡,无法再进行攻击。
关键观察
-
失败条件:一方失败有两种情况:
- 本体生命值归零
- 骑士死亡(因为骑士死亡后,对方可以在自己的回合直接攻击本体,最终导致本体死亡)
-
本质等价性:由于骑士死亡后相当于失去攻击能力,对方可以无压力地攻击本体,所以本体和骑士的生存是同等重要的。游戏实际上变成了:谁的本体和骑士中生命值较低的那个先被对方打到 ,谁就输。
-
最优策略:双方都会优先攻击对方生命值较低的目标(本体或骑士),因为这样可以更快地使对方失去战斗能力。
策略推导
设:
- 水母的最小生命值:
- 花花的最小生命值:
为什么比较最小值?
- 如果水母攻击,她可以选择攻击花花本体 或花花骑士 ,目标是尽快使 变为
- 如果花花攻击,她可以选择攻击水母本体 或水母骑士 ,目标是尽快使 变为
由于双方都采取最优策略,且水母先手,游戏的结果取决于谁能更快地击破对方的最小生命值目标。
胜负判定
- 如果 ,水母获胜
- 否则,花花获胜
原因:
- 当 时,水母可以在花花击破自己的最小生命值之前,先击破花花的最小生命值,从而获胜
- 当 时,花花可以在水母击破自己的最小生命值之前,先击破水母的最小生命值,从而获胜
复杂度分析
- 时间复杂度: 每个测试用例
- 空间复杂度: 每个测试用例
代码实现
#include<bits/stdc++.h> using namespace std; inline void solve(){ int a = 0, b = 0, c = 0, d = 0; scanf("%d %d %d %d", &a, &b, &c, &d); if(min(a, c) >= min(b, d)) printf("Gellyfish\n"); else printf("Flower\n"); } int main(){ int T = 0; scanf("%d", &T); for(int i = 0 ; i < T ; i ++) solve(); return 0; }示例验证
以第一个测试用例 为例:
- 由于 ,花花获胜,与输出一致
第二个测试用例 :
- 由于 ,水母获胜,与输出一致
-
- 1
信息
- ID
- 6174
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 7
- 已通过
- 1
- 上传者