# 881.救生艇

## 问题描述
[881. 救生艇 (Medium)](https://leetcode.cn/problems/boats-to-save-people/)

给定数组 `people` 。 `people[i]` 表示第 `i` 个人的体重 ，
**船的数量不限**，每艘船可以承载的最大重量为 `limit`。

每艘船最多可同时载两人，但条件是这些人的重量之和最多为 `limit`。

返回 承载所有人所需的最小船数 。

**示例 1：**

```
输入：people = [1,2], limit = 3
输出：1
解释：1 艘船载 (1, 2)

```

**示例 2：**

```
输入：people = [3,2,2,1], limit = 3
输出：3
解释：3 艘船分别载 (1, 2), (2) 和 (3)

```

**示例 3：**

```
输入：people = [3,5,3,4], limit = 5
输出：4
解释：4 艘船分别载 (3), (3), (4), (5)
```

**提示：**

- `1 <= people.length <= 5 * 10⁴`
- `1 <= people[i] <= limit <= 3 * 10⁴`

## 解题思路
每次必定选择最轻的的和二者重量和不超过`limit`的最重的人上船，因此可以将数组排序，然后一左一右双指针向中间遍历。

## 代码
```cpp
class Solution {
public:
    int numRescueBoats(vector<int>& people, int limit) {
        std::sort(people.begin(), people.end());
        int left = 0, right = people.size() - 1;
        int cnt = 0;
        while (left <= right) {
            if (people[right] + people[left] <= limit) {
                cnt++;
                right--;
                left++;
            } else {
                cnt++;
                right--;
            }
        }
        return cnt;
    }
};
```

