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                            
时间: 2024-10-13 02:04:57

1029: [JSOI2007]建筑抢修的相关文章

BZOJ 1029 [JSOI2007] 建筑抢修(贪心)

1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2285  Solved: 1004[Submit][Status] Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达

BZOJ 1029: [JSOI2007]建筑抢修【优先队列+贪心策略】

1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 4810  Solved: 2160[Submit][Status][Discuss] Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的 入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全 毁坏.现在的情况是:T部落基地里只有一个修理

BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心

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

BZOJ 1029 [JSOI2007]建筑抢修

1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MBSubmit: 2748  Solved: 1213[Submit][Status][Discuss] Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人

BZOJ 1029: [JSOI2007]建筑抢修 优先队列

1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1029 Description 小 刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设 施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地

bzoj 1029 [JSOI2007]建筑抢修 - 贪心 + 大根堆

1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MB Description 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需要一定的时间.同时,修理工人修理完一个建

BZOJ 1029: [JSOI2007]建筑抢修 贪心

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1029 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需要一定的时间.同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建

【BZOJ】1029: [JSOI2007]建筑抢修(贪心)

http://www.lydsy.com/JudgeOnline/problem.php?id=1029 按右端点排序后依次加入,并且每一次看是否能被修筑,如果能就修:否则查找原来修过的,如果原来修过的最大的建筑花的时间比当前所要花的时间大,那么我们就决策:不修原来那个,改为修当前的(因为起点一样,所花时间少,两者的右边界都是满足的,用了后者时间能减少,使得给可能存在的后边的解提供机会).可以证明这样最优. #include <cstdio> #include <cstring>

BZOJ 1029 JSOI2007 建筑抢修 贪心+堆

题目大意:n个建筑须要抢修.第i个建筑须要T1时间抢修.必须在T2时间之前抢修完成.求最多能抢修多少建筑 首先我们对T2排序 然后依次修理 可是这样贪心显然是不对的 比方说这组数据: 5 10 10 10 20 2 21 2 21 2 21 贪心仅仅能修理前两个.而实际上最多能够修理4个 于是我们考虑修正贪心算法 比方说这组数据,当我们枚举到3的时候.尽管已经无法修理很多其它了,可是我们能够取消修理建筑1而改修理3.这样尽管不能更新ans 可是能够为后面的建筑节省时间 所以做法就非常明白了 我们