小美打怪(动态规划)

小美在玩游戏,游戏中有 n 个怪物,怪物的血量为 h,攻击力为 ai​。小美的血量为 H,攻击力为 A,小美可以击败血量和攻击力都小于自己的怪物,并且打败后血量降为怪物的血量,攻击力降为怪物的攻击力。小美想知道最多可以打败多少怪物。

#include<bits/stdc++.h>
#include<vector>
using namespace std;
typedef pair<int,int> P;
bool cmp(P a, P b)
{
    return a.first<b.first||(a.first==b.first&&a.second>b.second);
}
int main()
{
    int n, H, A;
    cin >> n >> H >> A;
    vector<P>p(n);
    for(int i = 0; i < n; i ++)
        cin >> p[i].first;
for(int i = 0; i < n; i ++)
       cin >> p[i].second;
    sort(p.begin(), p.end(), cmp);
    vector<int>g;
    for(int i = 0; i < n; i ++)
    {
        int x=p[i].second,y=p[i].first;
        if(H <= y || A <= x) 
            continue;
        auto it=lower_bound(g.begin(),g.end(),x);
        if(it==g.end())
            g.push_back(x);
        else *it=x;
    }
    cout << g.size() << '\n';
}

 这个题目类似于背包问题,给定一组物品,每个物品有两个属性(重量和价值),以及两个整数H和A。要求在不超过背包容量H的情况下,尽可能多地选取物品放入背包,并且物品的价值必须大于等于A。输出满足条件的物品数量。

  1. 定义一个自定义类型P,它是pair<int, int>的别名,用于存储物品的重量和价值。

  2. 定义比较函数cmp,用于对物品按照“价值相同时优先选取重量大的”的原则进行排序。这里的排序是降序排列,因为在题目描述中并没有明确指出价值小的优先,但是根据实际情况,如果价值相等,应该选择重量大的。

  3. 输入整数n(物品数量)、H(背包容量)和A(物品价值下限)。

  4. 创建一个大小为n的vector<P>容器p,存储每个物品的重量和价值。

  5. 依次读入每个物品的重量和价值,并存入容器p中。

  6. 对物品按照比较函数cmp定义的规则进行排序。

  7. 创建一个vector<int>容器g,用于存储满足条件的物品重量。

  8. 遍历排序后的物品列表p,对于每个物品,检查其重量是否超过背包容量H或其价值是否低于阈值A。如果满足这两个条件之一,则跳过当前物品。

  9. 如果物品符合条件,则在容器g中查找第一个大于等于当前物品重量x的位置。这里使用了lower_bound函数。

  10. 如果在g中找不到大于等于x的元素,则将x添加到g的末尾;如果找到了这样的元素,则替换该位置的元素为x。

  11. 遍历结束后,输出满足条件的物品数量,即g的大小。

  • 怪物的血量(h)和攻击力(ai)可以看作是背包问题中的“物品”,每个怪物对应一个物品,物品的“价值”是击败怪物的数量(1个单位)。

  • 小美的血量(H)和攻击力(A)可以理解为背包的“容量”,每次击败一个怪物后,小美的血量和攻击力都会变成被击败怪物的血量和攻击力,这意味着每次决策都会影响后续决策的可行性和收益。

  • 由于血量和攻击力的变化特性,它并不完全符合常见的背包问题模型,而更像是一个带有状态转移约束的决策过程问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

筱姌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值