[2013.10.11]饥饿的奶牛

今天这么有意义的日子不写点儿什么浪费了是吧、、

(...)

http://dyssldezx.openjudge.cn/fornoip2013/10002/

描述

 周老师为了让信息学奥赛班的学生能更好地投入到备战信息学竞赛中去,决定自己养若干奶牛,每天早上挤一些牛奶给学生每天喝,补充营养。但喂养奶牛也是一件麻烦事,每天晚上奶牛都要进食。由于条件比较简陋,并不一定所有奶牛都能吃到食物。奶牛的进食方式是这样的:周老师有m个食桶(1<=m<=2000),分别编号为1..m。这些食桶被按照编号排成一行。周老师将奶牛们分成若干组,每组奶牛总是呆在一起进食的,每组奶牛会提出要求——他们需要吃第start到第end桶中的食物。可能存在若干组奶牛都要吃同一个桶中的食物,从而就产生了冲突,这时周老师只能满足其中一组的要求,另一些组就只能饿肚子了。

  周老师当然不想让奶牛都饿肚子,所以他希望根据奶牛们提出的请求,满足其中一些组的要求,使得最多的食桶被奶牛食用。这个难题困扰着周老师,他希望得到你的帮助。

输入第一行一个整数n,表示奶牛的组数。(1<=n<=1000)
第2~n+1行,每行两个整数start和end,描述了一组奶牛提出的请求。输出一个整数,表示最多有多少个食桶可以被食用。样例输入

3
1 3
7 8
3 4

样例输出

5

提示(满足第1组和第2组奶牛的要求,这样1~3号和7~8号这5个食桶可以被食用)

(...)

略**的题目修改、、、

DP飘过、、、

首先按照结束排序、、(你愿意按开始?随你便吧、、)

然后、、、

xx:=First(h[xx]=i) to Last(h[xx]=i);

f[i]:=Max(f[h[xx]-1]+(Start[xx]-End[xx]+1));

因为排过序了所以顺着加就行了,不用每次再搜、、

上代码:

 1 Var
 2   f,h,t:Array[0..2001] of longint;
 3   i,j,n,m:longint;
 4   Tt,xx:longint;
 5   Iris:longint;
 6 Procedure qSort(l,r:longint);
 7   Var
 8     i,j,Mid,Tmp:longint;
 9   Begin
10     i:=l;
11     j:=r;
12     Mid:=t[(l+r) Shr 1];
13     Repeat
14       While t[i]<mid do inc(i);
15       While Mid<t[j] do Dec(j);
16       if i<=j Then
17         Begin
18           Tmp:=t[j];
19           t[j]:=t[i];
20           t[i]:=Tmp;
21           Tmp:=h[j];
22           h[j]:=h[i];
23           h[i]:=Tmp;
24           Inc(i);
25           Dec(j);
26         End;
27     Until i>j;
28     if i<r Then qSort(i,r);
29     if l<j Then qSort(l,j);
30   End;
31 Begin
32   Read(n);
33   For i:=1 to n do
34     Begin
35       Read(h[i],t[i]);
36       if T[i]>m Then m:=T[i];
37     End;
38   qSort(1,n);
39   xx:=1;
40   For i:=1 to m do
41     Begin
42       f[i]:=f[i-1];
43       If xx<=m Then
44         While t[xx]=i do
45           Begin
46             Tt:=f[h[xx]-1]+(t[xx]-h[xx]+1);
47             if Tt>f[i] Then f[i]:=Tt;
48             Inc(xx);
49           End;
50       if f[i]>Iris Then Iris:=f[i];
51     End;
52   Writeln(Iris);
53 End.
原文地址:https://www.cnblogs.com/Catch-22/p/3364241.html