a_lc_完成所有任务的最少初始能量(反向思维+贪心)

有一个任务i,它的要求是\([x_i, y_i]\),xi表示花费的实际能量,yi表示完成该任务前你需要拥有的能量,问完成所有任务需要的最少能量

思路:这题一直wa没做出来,思路是:

  • 因为我们最终要把任务全都做完,所以优先做 \(y_i-x_i\) 差值大的任务,因为做完这样的任务后,可以收获的能量较多
class Solution {
public:
    struct node {
        int cost, thre;
        bool operator<(const node& b) const { return thre-cost<b.thre-b.cost; }
    };
    int minimumEffort(vector<vector<int>>& tasks) {
        int ans=0, remain=0;
        priority_queue<node, vector<node>> q;
        for (auto& task : tasks) q.push({task[0], task[1]});

        while (!q.empty()) {
            node task=q.top(); q.pop();
            if (remain>=task.thre) { //能用之前省下来的能量解决
                remain-=task.cost;
            } else {
                ans+=task.thre-remain; //否则,则需要花费task.thre-remain的能量
                remain=task.thre-task.cost;
            }
        }
        return ans;
    }
};
posted @ 2020-11-22 16:31  童年の波鞋  阅读(157)  评论(0编辑  收藏  举报