zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    加工零件(Dijkstra)
    尼克的任务(DP)
    挖地雷(记忆化搜索)
    滑雪(DP,记忆化搜索)
    子串和子序列(DP)
    八皇后(DFS)
    打印feign报错日志
    restTemplate 踩坑
    共享全局对象
    获取当月多少天
  • 原文地址:https://www.cnblogs.com/hkxy125/p/8513127.html
Copyright © 2011-2022 走看看