• UVa 1153


    链接:

    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
    ", Q.size());
    31         if(T) printf("
    ");
    32     }
    33     return 0;
    34 }
  • 相关阅读:
    博客园转文章的方法
    http协议相关面试题
    接口测试基础01
    文件上传下载
    括号-回溯
    幂集-回溯
    分割数组为连续子序列- -贪心法
    不使用临时变量交换数字
    计数质数
    拼接最大值
  • 原文地址:https://www.cnblogs.com/hkxy125/p/8513127.html
Copyright © 2020-2023  润新知