比赛 模拟测试2 评测结果 AAAAAAAAAA
题目名称 火车调度 最终得分 100
用户昵称 mouse 运行时间 0.000 s
代码语言 Pascal 内存使用 0.00 MiB
提交时间 2010-10-12 19:20:59
显示代码纯文本
program train;
const
  maxn=100;
var
  f1:array[0..maxn]of longint;
  f2:array[-1..maxn,-1..maxn]of longint;
  f3:array[-2..maxn,-2..maxn,-2..maxn]of longint;
  t:array[-2..maxn,1..2]of longint;
  i,j,k,m,n:longint;
procedure find1(p1:longint);
  var
    p2:longint;
  begin
    if f1[p1]<>0 then{f1[p1]表示当前站内正在停p1号车时,最多还能有多少车进站}
      exit;
    f1[p1]:=1;
    for p2:=p1+1 to n do{枚举下一辆车}
      if t[p2,1]>=t[p1,2] then
        begin
          find1(p2);
          if f1[p2]+1>f1[p1] then
            f1[p1]:=f1[p2]+1;
        end;
  end;
procedure find2(p1,p2:longint);
  var
    p3:longint;
  begin
    if f2[p1,p2]<>0 then{f2[p1,p2]表示当前站内正在停p1,p2号车时,最多还能有多少车进站}
      exit;
    f2[p1,p2]:=1;
    for p3:=p2+1 to n do{枚举下一辆车}
      if (t[p3,2]>=t[p2,2])and(t[p3,1]>=t[p1,2]) then
        begin
          find2(p2,p3);
          if f2[p2,p3]+1>f2[p1,p2] then
            f2[p1,p2]:=f2[p2,p3]+1;
        end;
  end;
procedure find3(p1,p2,p3:longint);
  var
    p4:longint;
  begin
    if f3[p1,p2,p3]<>0 then{f3[p1,p2,p3]表示当前站内正在停p1,p2,p3号车时,最多还能有多少车进站}
      exit;
    f3[p1,p2,p3]:=1;
    for p4:=p3+1 to n do{枚举下一辆车}
      if (t[p4,2]>=t[p3,2])and(t[p4,1]>=t[p1,2]) then
        begin
          find3(p2,p3,p4);
          if f3[p2,p3,p4]+1>f3[p1,p2,p3] then
            f3[p1,p2,p3]:=f3[p2,p3,p4]+1;
        end;
  end;
begin
  assign(input,'train.in');reset(input);
  readln(n,m);
  for i:=1 to n do
    readln(t[i,1],t[i,2]);
  close(input);

  for i:=1 to n do{按进站时间排序,其次按出站时间排序,这样动规可以得到最大值}
    for j:=i+1 to n do
      if (t[i,1]>t[j,1])or(t[i,1]=t[j,1])and(t[i,2]>t[j,2]) then
        begin
          t[0]:=t[i];t[i]:=t[j];t[j]:=t[0];
        end;

  for i:=-2 to 0 do{边界条件}
    for j:=1 to 2 do
      t[i,j]:=t[1,1]-1;

  assign(output,'train.out');rewrite(output);
  case m of{对m分情况讨论,因为状态可能不多,所以采用记忆化搜索比较合适}
    1:begin
        find1(0);
        writeln(f1[0]-1);
      end;
    2:begin
        find2(-1,0);
        writeln(f2[-1,0]-1);
      end;
    3:begin
        find3(-2,-1,0);
        writeln(f3[-2,-1,0]-1);
      end;
  end;
  close(output);
end.