現有 N 本書需印刷裝訂。每一本書必須先印刷再裝訂。工廠有 N 台裝訂機但只有一台印刷機。印刷機同時只能印一本書,而且必需印完一本書後才能印下一本書。現給定每一本書的印刷時間和裝訂時間,請計算所有書最快要多久才能印刷裝訂完畢。
範例測資
範例輸入 | 範例輸出 |
---|---|
EOF 輸入,輸入第一行為 N,即書的數目 (1 <= N <= 1000)。 以下 N 行每行代表一本書,每行有兩個數字。第一個數字代表書的印刷時間,第二個數字代表書的裝訂時間,時間都介於 1 到 1000 之間。 | 輸出所有書最快印刷裝訂完畢的時間。 |
2 5 2 1 1 2 10 9 9 8 | 7 27 |
解題思路
使用 Pair<int, int> 來收資料,只是要將資料反過來存,印刷時間存在 second,裝訂時間則存在 first。收完資料之後要將 Pair 陣列進行排序,然後跑 For迴圈 從 N-1 到 0,要從「裝訂時間最大」的資料開始做處理。
設定兩個變數 ans 和 start,都預設為 0。每次進到 For迴圈 時,都要將 start += 目前資料的印刷時間,start 是指所有資料所需的印刷時間,因為印刷機只有一臺。然後要計算 start + 裝訂時間是多少,並且和目前的 ans 做最大值的比較,ans 就是每次的印刷總時間 + 現在的裝訂時間最大值。
範例程式碼-ZeroJudge B231: 書
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
int N;
while (cin >> N) {
pair<int, int> dom[5000] = {};
for (int i = 0; i<N; i++) cin >> dom[i].second >> dom[i].first;
sort(dom, dom+N);
int ans = 0, start = 0;
for (int i = N-1; i>=0; i--) {
start += dom[i].second;
int tmp = start + dom[i].first;
ans = max(tmp, ans);
}
cout << ans << "\n";
}
}
//ZeroJudge B231
//Dr. SeanXD