• 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.



  • 相关阅读:
    Spring Boot 如何使用拦截器、过滤器、监听器
    数据库水平分库扩展
    单点登录OAuth2
    三种合并请求的方式帮提高接口性能
    大型项目前端架构设计
    mysql总结列表
    互联网金融架构发展史
    实战!工作中常用到哪些设计模式
    代码对比工具,就用这7个!
    开发必备的常用 Linux 命令整理
  • 原文地址:https://www.cnblogs.com/neverforget/p/2427929.html
Copyright © 2020-2023  润新知