贪心(临项交换)

前言:对待这个问题,我想到就是一定是贪心,但是我不知道怎么排序

对待这种问题,肯定是要先假设只有两个,我们要怎么排序呢


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    long long minDamage(int power, vector<int>& damage, vector<int>& health) {
        int n = health.size();
        vector<pair<int, int>> a(n);
        for (int i = 0; i < n; i++) {
            a[i] = {(health[i] - 1) / power + 1, damage[i]};
        }
        ranges::sort(a, [](const auto& p, const auto& q) {
            return p.first * q.second < q.first * p.second;
        });

        long long ans = 0, s = 0;
        for (auto& [k, d] : a) {
            s += k;
            ans += s * d;
        }
        return ans;
    }
};

我们再来看一个类似的题目

在这里插入图片描述
在这里插入图片描述

这个题目和上面这个题目的共同点就是都存在一个固定值,上面这一题的固定值就是cnt是固定的,这一题是花在能力损耗的值是一定的,我们需要虚耗的少一些

bool cmp(vector<int> a, vector<int> b) {
    int u = a[1] - a[0]; int v = b[1] - b[0];
    if (u > v) return 1;
    else if (u == v) return a[1] > b[1];
    return 0;
}

class Solution {
public:
    int minimumEffort(vector<vector<int>>& tasks) {
        int n = tasks.size();
        sort(tasks.begin(), tasks.end(),cmp);
        int num = 0;
        for (int i = 0; i < n; i++) {
            num += tasks[i][0];
        }
        int ans = num;
        for (int i = 0; i < n; i++) {
            if (num >= tasks[i][1]) {
                num -= tasks[i][0];
            }
            else {
                ans += tasks[i][1] - num;
                num = tasks[i][1] - tasks[i][0];
            }
        }return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wniuniu_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值