> For the complete documentation index, see [llms.txt](https://hao-fu-1.gitbook.io/oj/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hao-fu-1.gitbook.io/oj/greedy/1665.-minimum-initial-energy-to-finish-tasks.md).

# 1665. Minimum Initial Energy to Finish Tasks

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`

每个任务有<消耗能量，启动所需最小能量>，问至少需要多少能量能完成所有任务。启动所需能量-消耗能量=完成任务所省下的能量，为了能让所须能量尽量小，也就是尽量在完成任务时省下能量，以（启动所需能量-消耗能量）从大到小排序作为完成所有任务的顺序。按照该顺序依次遍历任务，saving记录当前所剩下的能量，当所需mmin大于saving时，总所须res添加(mmin-saving)新能量，此时saving = mmin - saving + saving - cost = mmin - cost。

```python
class Solution:
    def minimumEffort(self, tasks: List[List[int]]) -> int:
        tasks = sorted(tasks, key=lambda x: x[1] - x[0], reverse=True)
        saving, res = 0, 0
        for cost, mmin in tasks:
            if mmin > saving:
                res += mmin - saving
                saving = mmin
            saving -= cost
        return res
    
```
