题目: | 挤牛奶 | |
来源: | Usaco1.2.1 | |
题目大意: | 给定N个人,每个人有个开始时间和结束时间,求最长的无人时间和最长的有人时间 | |
数据范围: | 1 <= N <= 5000,时间小于1000000 | |
样例: |
3 300 1000 700 1200 1500 2100 |
900 300 |
做题思路: | 本来一看想用线段树,一想太麻烦就换了,原来直接按开始时间排序然后直接模拟就好,这个叫离散化?貌似吧 | |
知识点: | 线段树、快排、模拟、离散化、搜索 |
{
ID:Dount Nameless
TASK:milk2
LANG:PASCAL
}
type
act=record
st,ed:longint;
end;
var
i,j,st,ed,ans,ans1,n:longint;
a:array[0..5010]of act;
procedure qsort(l,r:longint);{<快排不解释>}
var
i,j,k:longint;
t:act;
begin
i:=l;j:=r;k:=a[(l+r)div 2].st;
repeat
while a[i].st<k do inc(i);
while a[j].st>k do dec(j);
ifi<=j then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
inc(i);dec(j);
end;
until i>j;
ifi<r then qsort(i,r);
ifj>l then qsort(l,j);
end;
begin
assign(input,'milk2.in');reset(input);
assign(output,'milk2.out');rewrite(output);
readln(n);
fori:=1 to n do
readln(a[i].st,a[i].ed);
qsort(1,n);
st:=a[1].st;ed:=a[1].ed;{<先手动记录第一个时间>}
ans:=ed-st;
fori:=2 to n do
begin
ifed>=a[i].st then
begin
if ed<a[i].ed then ed:=a[i].ed;{<下一个人的开始时间小于该人的结束时间则相连>}
end
else
begin{<否则更新答案>}
if ans<(ed-st) then ans:=ed-st;
if ans1<(a[i].st-ed) then ans1:=a[i].st-ed;
st:=a[i].st;ed:=a[i].ed;
end;
end;
writeln(ans,' ',ans1);
close(input);close(output);
end.
题目来源:
http://ace.delos.com/usacoprob2?a=RexmW8CclSt&S=milk2