您的位置:首页 > 其它

[BZOJ1620][Usaco2008 Nov]Time Management 时间管理

2015-09-12 22:13 316 查看

传送门

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

题目大意

给定n个任务的花费时间和最晚结束时间,询问最晚开始工作能完成所有任务

题解

我们考虑时间上相靠近的两个任务,分别为i和i+1

x[i,1]表示完成任务的时间,x[i,2]表示最晚完成时间

ans=ans-x[i,1] (ans<=x[i,2])

ans=x[i,2]-x[i,1] (ans>x[i,2])

注意无解情况

var
x:array[0..1005,1..2]of longint;
i,n,ans:longint;
procedure sort(l,r: longint);
var i,j,a,y:longint;
begin
i:=l; j:=r; a:=x[(l+r) div 2,2];
repeat
while x[i,2]<a do inc(i);
while a<x[j,2] do dec(j);
if not(i>j) then
begin
y:=x[i,2]; x[i,2]:=x[j,2]; x[j,2]:=y;
y:=x[i,1]; x[i,1]:=x[j,1]; x[j,1]:=y;
inc(i); dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;

begin
readln(n);
for i:=1 to n do
readln(x[i,1],x[i,2]);
sort(1,n); {x[i,2]}
ans:=x[n,2]-x[n,1];
for i:=n-1 downto 1 do
if x[i,2]>=ans
then ans:=ans-x[i,1]
else ans:=x[i,2]-x[i,1];
if ans<0 then writeln(-1) else writeln(ans);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: