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 }