pku1946 Cow Cycling
有n只奶牛进行自行车环跑,如果奶牛一分钟要跑x圈,则领跑者消耗x*x体力,后面跟跑的消耗x体力。现在给出N头奶牛的数目N,每头奶牛原先所具有的能量E,需要环跑的圈数D。只要有一只奶牛先达到D圈,就算完成环跑,求奶牛能否完成环跑,如果不能,输出0。否则,输出环跑的最短时间。
最优方案显然是n头牛轮流领跑,最后第n头牛冲线。
f[i,j,k]表示当前第i头牛领跑,已经领跑j圈,它已经消耗了k点体力的最短时间。
写一个正推方程f[i,j+x,k+x*x]=min{f[i,j,k]+1}//领跑牛继续跑
f[i+1,j,j]=min{f[i,j,k]}//领跑牛换人
View Code
1 program pku1946(input,output);
2 const
3 MAXW = 10000000;
4 var
5 f : array[0..25,0..110,0..110] of longint;
6 n,e,d : longint;
7 answer : longint;
8 procedure init;
9 begin
10 readln(n,e,d);
11 fillchar(f,sizeof(f),63);
12 end; { init }
13 function min(aa,bb :longint ):longint;
14 begin
15 if aa<bb then
16 exit(aa);
17 exit(bb);
18 end; { min }
19 procedure main;
20 var
21 i,j,k,l : longint;
22 begin
23 f[1,0,0]:=0;
24 for i:=1 to n do
25 for j:=0 to d do
26 for k:=0 to e do
27 if f[i,j,k]<19950714 then
28 for l:=1 to e do
29 begin
30 if (j+l<=d)and(k+l*l<=e) then
31 f[i,j+l,k+l*l]:=min(f[i,j,k]+1,f[i,j+l,k+l*l]);
32 f[i+1,j,j]:=min(f[i+1,j,j],f[i,j,k]);
33 end;
34 answer:=MAXW;
35 for i:=0 to e do
36 if f[n,d,i]<answer then
37 answer:=f[n,d,i];
38 end; { main }
39 procedure print;
40 begin
41 writeln(answer);
42 end; { print }
43 begin
44 init;
45 main;
46 print;
47 end.