前言:对待这个问题,我想到就是一定是贪心,但是我不知道怎么排序
对待这种问题,肯定是要先假设只有两个,我们要怎么排序呢

 
 
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;
    }
};



















