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] = [actual`

:_{i}, minimum_{i}]

`actual`

is the actual amount of energy you_{i}**spend to finish**the`i`

task.^{th}`minimum`

is the minimum amount of energy you_{i}**require to begin**the`i`

task.^{th}

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:8Explanation: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:32Explanation: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:27Explanation: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 <= 10`

^{5}`1 <= actual`

_{i}<= minimum_{i}<= 10^{4}

**Related Topics**:

Greedy

## Solution 1. Greedy

Let `d[i] = A[i][1] - A[i][0]`

, 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[1] - a[0]) > (b[1] - b[0]); });
for (int i = 0; i < N; ++i) {
if (cur < A[i][1]) {
ans += A[i][1] - cur;
cur = A[i][1];
}
cur -= A[i][0];
}
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][0], A[i][1])`

.

```
// 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[1] - a[0]) < (b[1] - b[0]); });
for (auto &a : A) ans = max(ans + a[0], a[1]);
return ans;
}
};
```

Java

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