題意#
題目給定兩人要讀完 \( 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;
}
