UVa 1153 - Keep the Customer Satisfied

contents

  1. 1. Problem
  2. 2. Sample Input
  3. 3. Sample Output
  4. 4. Solution

Problem

每一個工作都有所需完成時間、截止日期。每一個時刻最多執行一項工作,請問最多能完成幾項工作。

Sample Input

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

1
4

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
// similar UVa 10154 - Weights and Measures
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; // max-heap
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;
}
/*
*/