leetcode 1665. 完成所有任务的最少初始能量 中等

给你一个任务数组 tasks ,其中 tasks[i] = [actuali, minimumi] :

  • actuali 是完成第 i 个任务 需要耗费 的实际能量。
  • minimumi 是开始第 i 个任务前需要达到的最低能量。

比方说,如果任务为 [10, 12] 且你当前的能量为 11 ,那么你不能开始这个任务。如果你当前的能量为 13 ,你可以完成这个任务,且完成它后剩余能量为 3 。

你可以按照 任意顺序 完成任务。

请你返回完成所有任务的 最少 初始能量。

示例 1:

复制代码
输入:tasks = [[1,2],[2,4],[4,8]]
输出:8
解释:
一开始有 8 能量,我们按照如下顺序完成任务:
    - 完成第 3 个任务,剩余能量为 8 - 4 = 4 。
    - 完成第 2 个任务,剩余能量为 4 - 2 = 2 。
    - 完成第 1 个任务,剩余能量为 2 - 1 = 1 。
注意到尽管我们有能量剩余,但是如果一开始只有 7 能量是不能完成所有任务的,因为我们无法开始第 3 个任务。

示例 2:

复制代码
输入:tasks = [[1,3],[2,4],[10,11],[10,12],[8,9]]
输出:32
解释:
一开始有 32 能量,我们按照如下顺序完成任务:
    - 完成第 1 个任务,剩余能量为 32 - 1 = 31 。
    - 完成第 2 个任务,剩余能量为 31 - 2 = 29 。
    - 完成第 3 个任务,剩余能量为 29 - 10 = 19 。
    - 完成第 4 个任务,剩余能量为 19 - 10 = 9 。
    - 完成第 5 个任务,剩余能量为 9 - 8 = 1 。

示例 3:

复制代码
输入:tasks = [[1,7],[2,8],[3,9],[4,10],[5,11],[6,12]]
输出:27
解释:
一开始有 27 能量,我们按照如下顺序完成任务:
    - 完成第 5 个任务,剩余能量为 27 - 5 = 22 。
    - 完成第 2 个任务,剩余能量为 22 - 2 = 20 。
    - 完成第 3 个任务,剩余能量为 20 - 3 = 17 。
    - 完成第 1 个任务,剩余能量为 17 - 1 = 16 。
    - 完成第 4 个任务,剩余能量为 16 - 4 = 12 。
    - 完成第 6 个任务,剩余能量为 12 - 6 = 6 。

提示:

  • 1 <= tasks.length <= 10^5
  • 1 <= actual​i <= minimumi <= 10^4

分析:在初始能量不变的情况下,最后一个任务开始需要达到的最低能量 minimumi 与其实际需要耗费的能量 actuali 的差值 remain 越大,那么最终剩余的能量越多。可以先做 remain 大的任务,尽可能将 remain 小的任务留到最后做,就能够保证在完成所有任务的情况下多余的能量最少。

cpp 复制代码
class Solution {
public:
    static bool cmp(vector<int>vec1,vector<int>vec2)
    {
        if(vec1[1]-vec1[0]<vec2[1]-vec2[0])return true;
        return false;
    }
    int minimumEffort(vector<vector<int>>& tasks) {
        int n=tasks.size(),ans=0,sub=0;
        sort(tasks.begin(),tasks.end(),cmp);
        ans=tasks[0][1];
        for(int i=1;i<n;++i)
        {
            ans+=tasks[i][0];
            if(ans<tasks[i][1])ans=tasks[i][1];
        }
        return ans;
    }
};
相关推荐
Nil2081 小时前
leetcode 763划分字母区间
算法·leetcode·职场和发展
不会就选b1 小时前
算法日常・每日刷题--<动态规划>20
算法·leetcode·动态规划
不会就选b2 小时前
算法日常・每日刷题--<动态规划>19
算法·leetcode·职场和发展
垆边人似月.4 小时前
华为机试题 :和为 K 的子数组个数
算法·leetcode·华为
夏幻灵5 小时前
每日一题:LeetCode 165:比较版本号
算法·leetcode·职场和发展
Navigator_Z5 小时前
LeetCode //C - 1288. Remove Covered Intervals
c语言·算法·leetcode
0+1116 小时前
算法 --链表
数据结构·算法·leetcode·链表
圣保罗的大教堂6 小时前
leetcode 2333. 最小差值平方和 中等
leetcode
Nil20811 小时前
leetcode 300最长递增子序列
算法·leetcode·职场和发展
yi01112 小时前
LeetCode 424. 替换后的最长重复字符|不定长滑动窗口:如何判断窗口是否合法?
笔记·python·算法·leetcode·双指针·滑动窗口