題意#
題目給定 \( n \) 個小孩與各自體重,準備搭乘摩天輪。
每個包廂最多承受 \( m \) 的重量(原輸入為 \( x \),這裡使用 \( m \)),且最多只能容納兩人。
我們需要求出載滿所有小孩所需的最少包廂數。
思路#
為了發揮包廂的最大承載效益,可以嘗試讓「最重的人」搭配「最輕的人」。
結合貪婪策略與雙指標(Two Pointers),首先將所有小孩的體重從小到大排序,
並使用兩個指標分別指向目前「最輕」與「最重」的小孩:
- 若最輕與最重的體重總和未超過限重 \( m \),則兩人共乘一個包廂,兩個指標同時向中間推進。
- 若兩人體重總和超過限重,代表最重的小孩無法與任何人共乘,必須獨自使用一個包廂,此時僅將最重的指標向內退縮。
每次操作皆會消耗一個包廂,持續篩選直到所有小孩皆被安排完畢(指標交錯)。
程式碼#
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define INF LONG_LONG_MAX/1000
#define WA() cin.tie(0)->sync_with_stdio(0)
#define all(x) (x).begin(), (x).end()
#define int long long
#define PII pair<int, int>
signed main() { WA();
int n, m, l, h, cnt = 0;
cin >> n >> m;
vector<int> v(n);
for (auto &i : v) cin >> i;
// 將小孩體重由小到大排序
sort(all(v));
// l 指向最輕的小孩,h 指向最重的小孩
l = 0, h = n-1;
while (l <= h) {
// 如果最輕加最重能塞得下同一包廂,兩人一起上車
if (v[l] + v[h] <= m) l++, h--, cnt++;
// 否則最重的只能自己坐一個包廂
else h--, cnt++;
}
// 輸出總共使用的包廂數
cout << cnt;
}
