快轉到主要內容

CSES-1631 Reading Books

標籤: 貪婪
目錄


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

題意
#

題目給定兩人要讀完 \( n \) 本書,每本書皆有固定的閱讀時間。
同一本書無法同時被兩人閱讀,因此必須錯開時間。
我們需要求出兩人讀完所有書所需的最少總時間。

思路
#

直覺上最理想的情況是兩人無縫交錯閱讀,總時間即為「所有書閱讀時間的總和」。
但存在一種極端情況:有一本書閱讀時間極長,甚至大於「其他所有書的時間總和」。

在此極端情況下,當其中一人閱讀該長篇書籍時,另一人會提前讀完其餘所有書而被迫等待。
兩人無法完美交錯,導致總時間變成「最長閱讀時間的兩倍」。

因此,解題關鍵在於找出「最花時間的書」,並將其與「剩餘書籍的閱讀時間總和」比較:

  • 若最長時間大於剩餘時間總和:發生極端的等待情況,總時間為「最常時間 \(\times 2\)」。
  • 若不超過:兩人可完美交錯閱讀,總時間即為「所有書閱讀時間總和」。

程式碼
#

#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();
    // sum 用來記錄所有書本的閱讀時間總和
    int n, sum = 0; cin >> n;
    vector<int> v(n);
    
    // 讀入每本書的時間並累加
    for (auto &i : v) cin >> i, sum += i;
    
    // 排序,主要是為了抓出最後那本最花時間的書
    sort(all(v));
    
    // 如果最花時間的書 (v.back()) 嚴格大於「剩下的所有書時間總和 (sum - v.back())」
    if (v.back() > sum-v.back()) 
        // 發生極端情況,總閱讀時間為最厚那本書的兩倍
        cout << v.back()*2;
    else 
        // 否則完美交錯,總時間為所有書的總和
        cout << sum;
}
Piau 的筆記本
作者
Piau 的筆記本
希望我寫下來的東西能夠長久的記在我的腦中