UVa 1153 - Keep the Customer Satisfied

链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3594

 

题意:

有n(n≤800000)个工作,已知每个工作需要的时间qi和截止时间di(必须在此之前完成),最多能完成多少个工作?
工作只能串行完成。第一项任务开始的时间不早于时刻0。

 

分析:

贪心 + 优先队列
先按截止时间从小到大排序,如果当前任务可串行完成则完成,否则,从已完成的任务中选择一个所需时间最大的
(可用优先队列),若当前任务的所需时间比所选任务的要小,则把所选任务换成当前任务。

 

代码:

 1 #include <cstdio>
 2 #include <queue>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 struct TYPE {
 7     int d, t; //所需时间,截止时间
 8     bool operator < (const TYPE& that) const {
 9         return t < that.t;
10     }
11 } a[800000+5];
12 
13 int main(){
14     int T, n;
15     scanf("%d", &T);
16     while(T--){
17         scanf("%d", &n);
18         for(int i = 0; i < n; i++) scanf("%d%d", &a[i].d, &a[i].t);
19         sort(a, a + n);
20 
21         int L = 0;
22         priority_queue<int> Q;
23         for(int i = 0; i < n; i++){
24             if(L + a[i].d <= a[i].t) L += a[i].d, Q.push(a[i].d);
25             else if(Q.size() && Q.top() > a[i].d){
26                 L = L - Q.top() + a[i].d;
27                 Q.pop();  Q.push(a[i].d);
28             }
29         }
30         printf("%d\n", Q.size());
31         if(T) printf("\n");
32     }
33     return 0;
34 }

 

posted @ 2018-03-06 10:55  Ctfes  阅读(117)  评论(0编辑  收藏  举报