题目: | 尼克的任务 | |
来源: | Tyvj 1034 | |
题目大意: | K个任务,包含一个开始时间、一个持续时间,每个任务一旦开始就必须直到结束, 期间不能执行别的任务,每个任务必须在开始时间时开始执行,有任务就不能不执 行,求在N时间内最大的空闲时间 | |
数据范围: | 1≤N≤10000,1≤K≤10000 | |
样例: | 15 6 1 2 1 6 4 11 8 5 8 1 11 5 | 4 |
做题思路: | 好经典的题记得是。倒着枚举,保证无后效 | |
知识点: | Dp |
type
act=record
st,ed:longint;
end;
var
a:array[0..10000]of act;
f:array[0..1000000]of longint;
n,i,j,k:longint;
procedure qsort(l,r:longint);
var
i,j,k:longint;
t:act;
begin
i:=l;j:=r;
k:=a[(l+r)shr 1].st;
repeat
whilea[i].st<k do inc(i);
whilea[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;
untili>j;
ifi<r then qsort(i,r);
ifj>l then qsort(l,j);
end;
function max(a,b:longint):longint;
begin
ifa<b then exit(b);
exit(a);
end;
begin
readln(n,k);
fori:=1 to k do
begin
readln(a[i].st,a[i].ed);
end;
qsort(1,k);
fillchar(f,sizeof(f),0);
fori:=n downto 1 do
ifi<>a[k].st then f[i]:=f[i+1]+1
else
while i=a[k].st do
begin
f[i]:=max(f[i],f[a[k].st+a[k].ed]);
dec(k);
end;
writeln(f[1]);
end.
题目来源:
http://www.tyvj.cn:8080/Problem_Show.asp?id=1034