阶梯教室设备利用
我们现有许多演讲要在阶梯教室中举行。每一个演讲都可以用唯一的起始和终止时间来确定,
如果两个演讲时间有部分或全部重复,那么它们是无法同时在阶级教室中举行的。现在我们想要尽
最大可能的利用这个教室,也就是说,我们需要在这些演讲中选择一些不重复的演讲来举行使得他们用的总时间尽可能的长。
我们假设在某一演讲结束的瞬间我们就可以立即开始另一个演讲。
任务:
请写一个程序:
? 在文本文件REZ.IN中读入所有演讲的起始和终止时间;
? 计算最大的可能演讲总时间;
? 把结果输出到文本文件REZ.OUT中。
Input
第一行包括一个正整数n,n ? 10000,为所有的演讲的数目。
以下的n行每行含有两个由空格隔开整数p和k,0 <= p < k<= 30000。
这样的一对整数表示一个演讲由时间p开始到时间k结束。
输出格式:
Output
输出唯一的一个整数,为最长的演讲总时间。
这类比较常见直接模版就好了,我是直接建边DP的,收第I分钟的状态可以直接由第I-1分钟的状态转移过来,然后就是个一个类似于TREE DP
的转移了,因为每个演讲可以在上个演讲结束后立即进行所以有:F[I]=MAX(F[SON[P]]+I-SON[P]);
CODE:
var
now,f:array[0..30000] of longint;
pre,son:array[0..10000] of longint;
n,tot,r:longint;
function max(a,b:longint):longint;
begin if a>b then exit(a); exit(b); end;
procedure add(a,b:longint);
begin
inc(tot); pre[tot]:=now[a]; now[a]:=tot; son[tot]:=b;
end;
procedure init;
var i,j,k,p,a,b:longint;
begin
readln(n); r:=0;
for i:=1 to n do
begin
readln(a,b);
add(b,a);
r:=max(r,b);
end;
for i:=1 to r do
begin
f[i]:=f[i-1];
p:=now[i];
while p>0 do
begin
f[i]:=max(f[i],f[son[p]]+i-son[p]);
p:=pre[p];
end;
end;
writeln(f[r]);
end;
begin
init;
end.