快轉到主要內容

CSES-1090 Ferris Wheel

目錄


題目連結:https://cses.fi/problemset/task/1090

題意
#

題目給定 \( 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;
}
Piau 的筆記本
作者
Piau 的筆記本
希望我寫下來的東西能夠長久的記在我的腦中