Formatted question description: https://leetcode.ca/all/1665.html

# 1665. Minimum Initial Energy to Finish Tasks (Hard)

You are given an array tasks where tasks[i] = [actuali, minimumi]:

• actuali is the actual amount of energy you spend to finish the ith task.
• minimumi is the minimum amount of energy you require to begin the ith task.

For example, if the task is [10, 12] and your current energy is 11, you cannot start this task. However, if your current energy is 13, you can complete this task, and your energy will be 3 after finishing it.

You can finish the tasks in any order you like.

Return the minimum initial amount of energy you will need to finish all the tasks.

Example 1:

Input: tasks = [[1,2],[2,4],[4,8]]
Output: 8
Explanation:
Starting with 8 energy, we finish the tasks in the following order:
- 3rd task. Now energy = 8 - 4 = 4.
- 2nd task. Now energy = 4 - 2 = 2.
- 1st task. Now energy = 2 - 1 = 1.
Notice that even though we have leftover energy, starting with 7 energy does not work because we cannot do the 3rd task.

Example 2:

Input: tasks = [[1,3],[2,4],[10,11],[10,12],[8,9]]
Output: 32
Explanation:
Starting with 32 energy, we finish the tasks in the following order:
- 1st task. Now energy = 32 - 1 = 31.
- 2nd task. Now energy = 31 - 2 = 29.
- 3rd task. Now energy = 29 - 10 = 19.
- 4th task. Now energy = 19 - 10 = 9.
- 5th task. Now energy = 9 - 8 = 1.

Example 3:

Input: tasks = [[1,7],[2,8],[3,9],[4,10],[5,11],[6,12]]
Output: 27
Explanation:
Starting with 27 energy, we finish the tasks in the following order:
- 5th task. Now energy = 27 - 5 = 22.
- 2nd task. Now energy = 22 - 2 = 20.
- 3rd task. Now energy = 20 - 3 = 17.
- 1st task. Now energy = 17 - 1 = 16.
- 4th task. Now energy = 16 - 4 = 12.
- 6th task. Now energy = 12 - 6 = 6.


Constraints:

• 1 <= tasks.length <= 105
• 1 <= actual​i <= minimumi <= 104

Related Topics:
Greedy

## Solution 1. Greedy

Let d[i] = A[i] - A[i], i.e. the difference between the minimum and actual energy for task i.

We should take tasks with greater d value first because in this way we can save more energy for later use.

// OJ: https://leetcode.com/problems/minimum-initial-energy-to-finish-tasks/

// Time: O(NlogN)
// Space: O(1)
class Solution {
public:
int minimumEffort(vector<vector<int>>& A) {
int N = A.size(), ans = 0, cur = 0;
sort(begin(A), end(A), [&](auto &a, auto &b) { return (a - a) > (b - b); });
for (int i = 0; i < N; ++i) {
if (cur < A[i]) {
ans += A[i] - cur;
cur = A[i];
}
cur -= A[i];
}
return ans;
}
};


## Solution 2.

Sort the array in ascending order of minimum - actual.

Take the tasks one by one, the minimum effort for A[0 .. i] is max(ans + A[i], A[i]).

// OJ: https://leetcode.com/problems/minimum-initial-energy-to-finish-tasks/

// Time: O(NlogN)
// Space: O(1)
class Solution {
public:
int minimumEffort(vector<vector<int>>& A) {
int ans = 0;
sort(begin(A), end(A), [](auto &a, auto &b) { return (a - a) < (b - b); });
for (auto &a : A) ans = max(ans + a, a);
return ans;
}
};


Java

class Solution {
public int minimumEffort(int[][] tasks) {
Arrays.sort(tasks, new Comparator<int[]>() {
public int compare(int[] task1, int[] task2) {
}
});
int minEnergy = 0;
int sum = 0;
int length = tasks.length;
for (int i = 0; i < length; i++) {