小美打怪
题目链接https://ac.nowcoder.com/acm/problem/261577
问题分析
问题描述
在这个游戏中,小美面临 n
个怪物,每个怪物具有血量 h[i]
和攻击力 a[i]
,而小美的初始血量和攻击力分别为 H
和 A
。小美能够击败那些血量和攻击力都小于自己的怪物,并且在击败怪物后,她的血量和攻击力将会变成该怪物的血量和攻击力。
问题要求我们计算出小美最多能够击败多少个怪物。
输入格式
- 第一行三个整数
n
、H
、A
,分别表示怪物的数量,小美的血量,小美的攻击力。 - 第二行
n
个整数h[i]
,表示每个怪物的血量。 - 第三行
n
个整数a[i]
,表示每个怪物的攻击力。
输出格式
输出小美最多能够击败的怪物数量。
思路分析
1. 基本思路
要解这个问题,首先要考虑的点是:
- 小美可以击败那些血量和攻击力都小于自己的怪物。
- 每当小美击败一个怪物后,她的血量和攻击力就会变为该怪物的血量和攻击力。
- 小美可以击败的怪物数量是一个递增的过程,且小美必须从最容易击败的怪物开始逐步击败,最大化她能够击败的怪物数量。
2. 动态规划(DP)思想
我们可以使用 动态规划 来解决这个问题。动态规划的核心是:
- 状态定义:
dp[i]
表示以第i
个怪物为结尾,小美最多可以击败的怪物数量。 - 状态转移:如果当前怪物
i
能够击败前面的某个怪物j
(即h[i] > h[j]
且a[i] > a[j]
),那么我们就更新dp[i] = max(dp[i], dp[j] + 1)
。
3. 排序
为了简化问题,我们可以先对怪物进行排序:
- 按照血量升序排序,确保小美可以优先击败血量较小的怪物。
- 在血量相同的情况下,我们按攻击力升序排序,这样可以确保小美尽可能从攻击力较小的怪物开始。
4. 最终计算
最后,我们需要遍历 dp
数组,找出满足条件(小美的血量和攻击力都大于怪物)的最大值,这就是小美能够击败的最多怪物数量。
解决方案
代码实现
# 输入数据
n = input()
G_num, M_blood, M_attack = map(int, n.split())
G_blood = list(map(int, input().split()))
G_attack = list(map(int, input().split()))
maxs = 0
dp = [1] * G_num
s = [{'a': G_attack[i], 'b': G_blood[i]} for i in range(G_num)]
# 按照怪物血量升序,攻击力升序排序
s.sort(key=lambda x: (x['b'], x['a']))
# 动态规划,计算每个怪物能击败的最多怪物数量
for i in range(G_num):
for j in range(i):
if s[i]['a'] > s[j]['a'] and s[i]['b'] > s[j]['b']:
dp[i] = max(dp[i], dp[j] + 1)
# 找到可以击败的最多怪物
for i in range(G_num):
if s[i]['a'] < M_attack and s[i]['b'] < M_blood:
maxs = max(maxs, dp[i])
print(maxs)