zoukankan      html  css  js  c++  java
  • 1029: [JSOI2007]建筑抢修

    1029: [JSOI2007]建筑抢修

    Time Limit: 4 Sec  Memory Limit: 162 MB
    Submit: 2382  Solved: 1033
    [Submit][Status]

    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

    HINT

     

    Source

     题解:啊啊啊啊啊又脑抽了(phile:我竟无言以对了 HansBug:唉,这就是搞了一星期吴仲华杯的后果)唉。。手生了没办法——珍爱生命,远离吴仲华杯(HansBug:反正再也没有了= =)!!!23333。。。好了思路——这是一个经典的贪心问题先按照deadline从小到大排序,然后每次保留一个当前消耗时间,假如已经消耗的时间+当前任务用时<=当前任务deadline的话,那就直接加进来;假如已消耗时间+当前任务用时>当前任务deadline的话,那检查一下当前任务耗时是否不比任何一次之前进行的任务都大,如果不是的话加进来,并把之前那个最大的扔出去;否则凉拌。。。(由于N<=150000,所以建议用大根堆维护,本萌妹还是继续用我萌萌哒左偏树,mua~~)
     
     1 var
     2    i,j,k,m,n,head:longint;
     3    l:int64;
     4    a,lef,rig,fix,b,c,d:array[0..200000] of longint;
     5 function min(x,y:longint):longint;inline;
     6          begin
     7               if x<y then min:=x else min:=y;
     8          end;
     9 function max(x,y:longint):longint;inline;
    10          begin
    11               if x>y then max:=x else max:=y;
    12          end;
    13 procedure swap(var x,y:longint);inline;
    14           var z:longint;
    15           begin
    16                z:=x;x:=y;y:=z;
    17           end;
    18 procedure sort(l,r:longint);inline;
    19           var i,j,x,y:longint;
    20           begin
    21                i:=l;j:=r;
    22                x:=c[(i+j) div 2];
    23                repeat
    24                      while c[i]<x do inc(i);
    25                      while c[j]>x do dec(j);
    26                      if i<=j then
    27                         begin
    28                              swap(c[i],c[j]);
    29                              swap(d[i],d[j]);
    30                              inc(i);dec(j);
    31                         end;
    32                until i>j;
    33                if l<j then sort(l,j);
    34                if i<r then sort(i,r);
    35           end;
    36 procedure merge(var x,y:longint);inline;
    37           begin
    38                if x=0 then swap(x,y);
    39                if y=0 then exit;
    40                if a[x]<a[y] then swap(x,y);
    41                merge(rig[x],y);
    42                fix[x]:=max(fix[lef[x]],fix[rig[x]])+1;
    43                if fix[lef[x]]<fix[rig[x]] then swap(lef[x],rig[x]);
    44           end;
    45 procedure cuthead(var head:longint);inline;
    46           begin
    47                if head=0 then exit;
    48                merge(lef[head],rig[head]);
    49                head:=lef[head];
    50           end;
    51 begin
    52      readln(n);
    53      for i:=1 to n do readln(d[i],c[i]);
    54      sort(1,n);l:=0;
    55      head:=0;m:=0;k:=0;
    56      fillchar(a,sizeof(a),0);
    57      fillchar(lef,sizeof(lef),0);
    58      fillchar(rig,sizeof(rig),0);
    59      fillchar(fix,sizeof(fix),0);
    60      for i:=1 to n do
    61          begin
    62               if int64(l+int64(d[i]))<=int64(c[i]) then
    63                  begin
    64                       l:=int64(l+int64(d[i]));inc(k);
    65                       inc(m);a[m]:=d[i];
    66                       j:=m;merge(head,j);
    67                  end
    68               else
    69                   begin
    70                        if (int64(d[i])<int64(a[head])) then
    71                           begin
    72                                l:=int64(l+int64(d[i])-int64(a[head]));
    73                                inc(m);a[m]:=d[i];
    74                                cuthead(head);j:=m;
    75                                merge(head,j);
    76                           end;
    77                   end;
    78          end;
    79      writeln(k);
    80      readln;
    81 end.
    82                            
  • 相关阅读:
    BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
    单例模式
    JDBC连接数据库查询信息的步骤(提取成配置文件方式)
    JDBC访问数据库查询信息的步骤(硬编码格式)
    大数据
    accp
    递归
    struts2中Action到底是什么,怎么理解
    转发和重定向的区别(简单解释)
  • 原文地址:https://www.cnblogs.com/HansBug/p/4190727.html
Copyright © 2011-2022 走看看