• BZOJ_1029_[JSOI2007]_建筑抢修_(贪心+优先队列)


    描述


    http://www.lydsy.com/JudgeOnline/problem.php?id=1029

    (n)个任务需要完成,给出每个任务所需时间(t_1)与deadline(t_2),问最多能完成多少个任务.

    分析


    对于两个任务(a,b),设(b.t_2>a.t_2).

    1.先完成(b),再完成(a),那么要求(T+a.t_1+b.t_1<=a.t_2<b.t_2).

    2.先完成(a),再完成(b),那么要求(T+a.t_1<=a.t_2,T+a.t_1+b.t_1<=b.t_2).

    显然第二种方案条件更宽松,更可能实现,所以我们先完成deadline小的.

    先以(t_2)为关键字排序.对于第(i)个任务:

    1.如果时间允许,那么完成它,并入队,ans++.

    2.如果时间不允许,如果队中(t_1)最大的比当前任务的(t_1)还要大,那么取出队头,把当前任务加进去(答案不变,但是让后面的任务的时间更充裕).

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn=150000+5;
     5 int n;
     6 struct node{
     7     int t1,t2;
     8     node(int t1=0,int t2=0):t1(t1),t2(t2){}
     9     bool operator < (const node &a) const { return t2<a.t2; }
    10 }a[maxn];
    11 inline void solve(){
    12     priority_queue <int> q;
    13     int now=0,ans=0;
    14     for(int i=1;i<=n;i++){
    15         if(now+a[i].t1<=a[i].t2) q.push(a[i].t1),now+=a[i].t1,ans++;
    16         else if(a[i].t1<=q.top()&&now-q.top()+a[i].t1<=a[i].t2){
    17             now+=a[i].t1-q.top();
    18             q.pop(); q.push(a[i].t1);
    19         }
    20     }
    21     printf("%d
    ",ans);
    22 }
    23 inline void init(){
    24     scanf("%d",&n);
    25     for(int i=1;i<=n;i++) scanf("%d%d",&a[i].t1,&a[i].t2);
    26     sort(a+1,a+1+n);
    27 }
    28 int main(){
    29     init();
    30     solve();
    31     return 0;
    32 }
    View Code

    1029: [JSOI2007]建筑抢修

    Time Limit: 4 Sec  Memory Limit: 162 MB
    Submit: 3565  Solved: 1637
    [Submit][Status][Discuss]

    Description

      小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的
    入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全
    毁坏。现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需
    要一定的时间。同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建筑。如果某个建筑在一
    段时间之内没有完全修理完毕,这个建筑就报废了。你的任务是帮小刚合理的制订一个修理顺序,以抢修尽可能多
    的建筑。

    Input

      第一行是一个整数N接下来N行每行两个整数T1,T2描述一个建筑:修理这个建筑需要T1秒,如果在T2秒之内还
    没有修理完成,这个建筑就报废了。

    Output

      输出一个整数S,表示最多可以抢修S个建筑.N < 150,000;  T1 < T2 < maxlongint

    Sample Input

    4
    100 200
    200 1300
    1000 1250
    2000 3200

    Sample Output

    3

    HINT

    Source

  • 相关阅读:
    @JsonFormat和@DateTimeFormat 实践测试
    spring jpa CrudRepository save 新建数据没有返回id
    多线程处理pdf附件转换
    contentsize ,ios 7和 ios7之前的 有点差别,
    区别,
    裁切图片,
    transform,
    简洁代码,
    这个系统,流程,入口,业务逻辑,
    pop,pop,如果break,会pop两次,
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5650359.html
Copyright © 2020-2023  润新知