合肥
合肥奥数网

合肥站
奥数网

信息学竞赛常用算法与策略:贪心策略(3)

合肥奥数网整理 2013-01-18 14:28:18

  例5:旅行家的预算问题:

  一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市,给定两个城市间的距离d1,汽车油箱的容量是c,每升汽油能行驶的距离d2,出发时每升汽油的价格是p,沿途加油站数为n(可为0),油站i离出发点的距离是di,每升汽油的价格是pi。

  计算结果四舍五入保留小数点后两位,若无法到达目的地输出“No answer"

   若输入:

  d1=275.6   c=11.9   d2=27.4   p=8   n=2

  d[1]=102     p[1]=2.9

  d[2]=220     p[2]=2.2

  output

  26.95

  本问题的贪心策略是:找下一个较便宜的油站,根据距离确定加满、不加、加到刚好到该站。

  程序如下:

  program jiayou;

  const maxn=10001;

  zero=1e-16;

  type

   jd=record

    value,way,over:real;

   end;

  var oil:array[1..maxn] of ^jd;

   n:integer;

   d1,c,d2,cost,maxway:real;

  function init:boolean;

  var i:integer;

  begin

   new(oil[1]);

   oil[1]^.way:=0;

   read(d1,c,d2,oil[1]^.value,n);

   maxway:=d2*c;

   for i:=2 to n+1 do

    begin

     new(oil[i]);

     readln(oil[i]^.way,oil[i]^.value);

     oil[i]^.over:=0;

    end;

   inc(n,2);

   new(oil[n]);

   oil[n]^.way:=d1;

   oil[n]^.value:=0;

   oil[n]^.over:=0;

   for i:=2 to n do

    if oil[i]^.way-oil[i-1]^.way>maxway then

     begin

      init:=false;

      exit

     end;

  init:=true;

  end;

  procedure buy(i:integer;miles:real);

  begin

   cost:=cost+miles/d2*oil[i]^.value;

  end;

  procedure solve;

  var i,j:integer;

    s:real;

  begin

   i:=1;j:=i+1;

   repeat

    s:=0.0;

    while( s<=maxway+zero) and (j<=n-1) and (oil[i]^.value<=oil[j]^.value) do

     begin

     inc(j);

     s:=s+oil[j]^.way-oil[j-1]^.way

     end;

    if s<=maxway+zero then

     if (oil[i]^.over+zero>=oil[j]^.way-oil[i]^.way) then

      oil[j]^.over:=oil[i]^.over-(oil[j]^.way-oil[i]^.way) else

      begin

       buy(i,oil[j]^.way-oil[i]^.way-oil[i]^.over);

       oil[j]^.over:=0.0;

      end

     else begin

      buy(i,maxway-oil[i]^.over);

      j:=i+1;

      oil[j]^.over:=maxway-(oil[j]^.way-oil[i]^.way);

      end;

     i:=j;

   until i=n;

   end;

  begin

   cost:=0;

   if init then begin

    solve;

    writeln(cost:0:2);

    end else writeln('No answer');

  end.

首页 上一页 下一页 尾页

相关推荐

点击查看更多
重点初中
首页 导航