自定义任务排序问题_LeetCode1665

问题描述

给你一个任务数组 tasks ,其中 tasks[i] = [ a c t u a l i actual_i actuali, m i n i m u m i minimum_i minimumi] :

a c t u a l i actual_i actuali 是完成第 i 个任务 需要耗费 的实际能量。
m i n i m u m i minimum_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 个任务。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-initial-energy-to-finish-tasks


算法推导

  设有n个任务 ( a 0 , m 0 )   ( a 1 , m 1 )   . . .   ( a n − 1 , m n − 1 ) (a_0,m_0)\ (a_1,m_1)\ ...\ (a_{n-1},m_{n-1}) (a0,m0) (a1,m1) ... (an1,mn1),总能量为 E E E,根据题意,若能顺利完成任务,需要满足以下不等式:
E ≥ m 0 \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad E \geq m_0 Em0

E − a 0 ≥ m 1 \quad \quad \quad \quad \quad \quad \quad \quad E - a_0 \geq m_1 Ea0m1

. . . . . . \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad\quad...... ......

E − a 0 − a 1 − . . . − a n − 2 ≥ m n − 1 E - a_0 - a_1 - ...-a_{n-2} \geq m_{n-1} Ea0a1...an2mn1

移项,将 E E E放在不等式左边:
E ≥ m 0 E ≥ a 0 + m 1 ⋯ E ≥ a 0 + a 1 + ⋯ + a n − 2 + m n − 1 \begin{aligned} & E \geq m_0\\ & E \geq a_0+m_1\\ & \cdots\\ & E \geq a_0+a_1+\cdots+a_{n-2}+m_{n-1} \end{aligned} Em0Ea0+m1Ea0+a1++an2+mn1
因此, E E E的最小值即为上述不等式右端的最大值,它只取决于任务的顺序。

  考虑局部最优解,任意交换两个相邻任务 ( a i , m i )   ( a i + 1 , m i + 1 ) (a_i,m_i)\ (a_{i+1},m_{i+1}) (ai,mi) (ai+1,mi+1)的顺序,交换后上述不等式中有两项发生变化,分别是交换前的:
E ≥ a 0 + a 1 + ⋯ + a i − 1 + m i = f ( i ) E ≥ a 0 + a 1 + ⋯ + a i − 1 + a i + m i + 1 = f ( i + 1 ) \begin{aligned} & E \geq a_0 + a_1 + \cdots+a_{i-1}+m_i = f(i)\\ & E \geq a_0 + a_1 + \cdots + a_{i-1} + a{i} + m_{i+1}=f(i+1) \end{aligned} Ea0+a1++ai1+mi=f(i)Ea0+a1++ai1+ai+mi+1=f(i+1)
和交换后的:
E ≥ a 0 + a 1 + ⋯ + a i − 1 + m i + 1 = f ′ ( i ) E ≥ a 0 + a 1 + ⋯ + a i − 1 + a i + 1 + m i = f ′ ( i + 1 ) \begin{aligned} & E \geq a_0+a_1+\cdots+a_{i-1}+m_{i+1} = f'(i)\\ & E \geq a_0+a_1+\cdots+a_{i-1}+a_{i+1}+m_i = f'(i+1) \end{aligned} Ea0+a1++ai1+mi+1=f(i)Ea0+a1++ai1+ai+1+mi=f(i+1)
假设交换后结果不会比交换前更好,则有
m a x ( f ( i ) , f ( i + 1 ) ) ≤ m a x ( f ′ ( i ) , f ′ ( i + 1 ) ) max(f(i),f(i+1))\leq max(f'(i),f'(i+1)) max(f(i),f(i+1))max(f(i),f(i+1))
又因为 f ( i ) < f ′ ( i + 1 )   f ′ ( i ) < f ( i + 1 ) f(i)<f'(i+1)\ f'(i)<f(i+1) f(i)<f(i+1) f(i)<f(i+1)恒成立,故不等式等价于
f ( i + 1 ) ≤ f ′ ( i + 1 ) f(i+1) \leq f'(i+1) f(i+1)f(i+1)
代入具体值可得
a i − m i ≤ a i + 1 − m i + 1 a_i-m_i \leq a_{i+1}-m_{i+1} aimiai+1mi+1
  综上所述,若任务序列中相邻任务满足 a i − m i ≤ a i + 1 − m i + 1 a_i-m_i \leq a_{i+1}-m_{i+1} aimiai+1mi+1这一条件时,序列达到了局部最优,此时若交换任意两个任务的次序,得到的结果都不会好于不交换,因此可以认为局部最优就是全局最优


程序代码

class Solution {
public:
    int minimumEffort(vector<vector<int>>& tasks) {
        auto cmp = [&](const auto &a,const auto &b){
            return a[0]-a[1] < b[0]-b[1];
        };
        sort(tasks.begin(),tasks.end(),cmp);
        int sum = 0, ans = tasks[0][1];
        for(int i = 0; i < tasks.size()-1; i++){
            sum += tasks[i][0];
            ans = max(ans, sum+tasks[i+1][1]);
        }
        return ans;
    }
};

时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn),空间复杂度 O ( l o g n ) O(logn) O(logn)


参考题解

https://leetcode-cn.com/problems/minimum-initial-energy-to-finish-tasks/solution/wan-cheng-suo-you-ren-wu-de-zui-shao-chu-shi-neng-/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值