Problem
每一個工作都有所需完成時間、截止日期。每一個時刻最多執行一項工作,請問最多能完成幾項工作。
1 2 3 4 5 6 7 8 9
| 1 6 7 15 8 20 6 8 4 9 3 21 5 22
|
Sample Output
Solution
類似 UVa 10154 - Weights and Measures 的做法。
按照截止日期由小排到大,接著嘗試放入每一個工作,當總需時間超過截止日期,把所需時間最多的工作給吐出來,這樣的貪心方法,將會使得工作數量最多。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <stdio.h> #include <map> #include <vector> #include <set> #include <queue> #include <math.h> #include <algorithm> #include <assert.h> using namespace std; #define eps 1e-6 #define MAXN 1048576 pair<int, int> D[MAXN]; bool cmp(pair<int, int> a, pair<int, int> b) { if (a.second != b.second) return a.second < b.second; return a.first < b.first; } int main() { int testcase, N, x, y; scanf("%d", &testcase); while (testcase--) { scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d %d", &x, &y); D[i] = make_pair(x, y); } sort(D, D+N, cmp); priority_queue<int> pQ; int t = 0; for (int i = 0; i < N; i++) { pQ.push(D[i].first); t += D[i].first; if (t > D[i].second) t -= pQ.top(), pQ.pop(); } printf("%d\n", (int) pQ.size()); if (testcase) puts(""); } return 0; }
|