• 1029: [JSOI2007]建筑抢修


    Description

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

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

    输出一个整数S,表示最多可以抢修S个建筑。 数据范围: N<150000,T1
    Sample Input
    4
    100 200
    200 1300
    1000 1250
    2000 3200

    Sample Output
    3

    先对t2进行排序,然后一个个加入

    如果now+t1<=t2,就直接加入

    如果now+t1>t2,那么就用它和已经加入的时间最大的比较,如果t1比它小就替换它

    用大根堆维护最大时间

      1 const
      2     maxn=150010;
      3  
      4 type
      5     node=record
      6       t1,t2:longint;
      7     end;
      8  
      9 var
     10     a:array[0..maxn]of node;
     11     n:longint;
     12  
     13 procedure swap(var x,y:node);
     14 var
     15     t:node;
     16 begin
     17     t:=x;x:=y;y:=t;
     18 end;
     19  
     20 procedure sort(l,r:longint);
     21 var
     22     i,j,y:longint;
     23 begin
     24     i:=l;j:=r;
     25     y:=a[(l+r)>>1].t2;
     26     repeat
     27       while a[i].t2<y do
     28         inc(i);
     29       while a[j].t2>y do
     30         dec(j);
     31       if i<=j then
     32       begin
     33         swap(a[i],a[j]);
     34         inc(i);
     35         dec(j);
     36       end;
     37     until i>j;
     38     if i<r then sort(i,r);
     39     if j>l then sort(l,j);
     40 end;
     41  
     42 procedure init;
     43 var
     44     i:longint;
     45 begin
     46     read(n);
     47     for i:=1 to n do
     48       with a[i] do
     49         read(t1,t2);
     50     sort(1,n);
     51 end;
     52  
     53 var
     54     q:array[0..maxn]of node;
     55     now,tot:longint;
     56  
     57 procedure down(x:longint);
     58 var
     59     i:longint;
     60 begin
     61     i:=x<<1;
     62     while i<=tot do
     63       begin
     64         if (i<tot) and (q[i+1].t1>q[i].t1) then inc(i);
     65         if q[x].t1<q[i].t1 then
     66           begin
     67             swap(q[x],q[i]);
     68             x:=i;
     69             i:=x<<1;
     70           end
     71         else break;
     72       end;
     73 end;
     74  
     75 procedure up(x:longint);
     76 var
     77     i:longint;
     78 begin
     79     while x>1 do
     80       begin
     81         i:=x>>1;
     82         if q[x].t1>q[i].t1 then
     83           begin
     84             swap(q[i],q[x]);
     85             x:=i;
     86             i:=x>>1;
     87           end
     88         else break;
     89       end;
     90 end;
     91  
     92 procedure work;
     93 var
     94     i:longint;
     95 begin
     96     for i:=1 to n do
     97       if now+a[i].t1<=a[i].t2 then
     98         begin
     99           inc(tot);
    100           q[tot]:=a[i];
    101           up(tot);
    102           inc(now,a[i].t1);
    103         end
    104       else
    105         if a[i].t1<q[1].t1 then
    106         begin
    107           now:=now-q[1].t1+a[i].t1;
    108           swap(a[i],q[1]);
    109           down(1);
    110         end;
    111     write(tot);
    112 end;
    113  
    114 begin
    115     init;
    116     work;
    117 end.
    View Code
  • 相关阅读:
    每日日报2020.9.30 1905
    每日日报2020.10.7 1905
    每日日报2020.10.2 1905
    每日日报2020.9.28 1905
    程序员修炼之道:从小工到专家 九月读书心得 1905
    每日日报2020.9.27 1905
    每日日报2020.9.29 1905
    每日日报2020.10.6 1905
    每日日报2020.10.5 1905
    每日总结2
  • 原文地址:https://www.cnblogs.com/Randolph87/p/3635041.html
Copyright © 2020-2023  润新知