【DP】饥饿的牛

 饥饿的牛

源程序名   HUNGER.??? (PAS,C,CPP)

可执行文件名   HUNGER.EXE

输入文件名   HUNGER.IN

输出文件名     HUNGER.OUT 

牛在饲料槽前排好了队。饲料槽依次用1到N(1<=N<=2000)编号。每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料。

    约翰提供B个区间的清单。一个区间是一对整数start-end,1<=start<=end<=N,表示一些连续的饲料槽,比如1-3,7-8,3-4等等。牛可以任意选择区间,但是牛选择的区间不能有重叠。

当然,牛希望自己能够吃得越多越好。给出一些区间,帮助这只牛找一些区间,使它能吃到最多的东西。

在上面的例子中,1-3和3-4是重叠的;聪明的牛选择{1-3,7-8},这样可以吃到5个槽里的东西。 

输入

第一行,整数B(1<=B<=1000)

第2到B+1行,每行两个整数,表示一个区间,较小的端点在前面。 

输出

仅一个整数,表示最多能吃到多少个槽里的食物。 

样例

HUNGER.IN

3

1 3

7 8

3 4 

HUNGER.OUT

5

=================================

=====================================

type
  node=record
         s,e:longint;
       end;
var
  b:longint;
  a:array[1..2000]of node;
  f:array[0..2000]of longint;
procedure init;
begin
  assign(input,'hunger.in');
  assign(output,'hunger.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

procedure qsort(s,t:longint);
var
  i,j:longint;
  x:node;
  tem:node;
begin
  i:=s; j:=t;
  x:=a[(s+t)shr 1];
  repeat
    while x.e<a[j].e do dec(j);
    while a[i].e<x.e do inc(i);
    if i<=j then
      begin
        tem:=a[i]; a[i]:=a[j]; a[j]:=tem;
        inc(i); dec(j);
      end;
  until i>j;
  if i<t then qsort(i,t);
  if s<j then qsort(s,j);
end;

function max(a,b:longint):longint;
begin
  if a>b then exit(a);
  exit(b);
end;

procedure main;
var
  i,j:longint;
  ans:longint;
begin
  readln(b);
  for i:=1 to b do
    readln(a[i].s,a[i].e);
  qsort(1,b);
  fillchar(f,sizeof(f),0);
  ans:=0;
  for i:=1 to b do
    for j:=a[i].s-1 downto 0 do
    begin
      f[a[i].e]:=max(f[a[i].e],f[j]+(a[i].e-a[i].s+1));
      if ans<f[a[i].e] then ans:=f[a[i].e];
    end;
  writeln(ans);
end;

begin
  init;
  main;
  terminate;
end.



 

阅读更多
文章标签: output input c
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭