Image Modal

合肥
合肥奥数网

合肥站
奥数网

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

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

  例6:n个部件,每个部件必须经过先A后B两道工序。

         以知部件i在A,B 机器上的时间分别为ai,bi。如何安排加工顺序,总加工时间最短?

  输入:

  5

 

部件 1 2 3 4 5
ai 3 5 8 7 10
bi 6 2 1 4 9

  输出:

  34

  1 5  4  2  3

  本问题的贪心策略是A机器上加工短的应优先,B机器上加工短的应靠后。

  程序如下:

  program workorder;

  const maxn=100;

  type jd=record

   a,b,m,o:integer;

   end;

  var n,min,i:integer;

   c:array[1..maxn] of jd;

   order:array[1..maxn] of integer;

  procedure init;

  var i:integer;

  begin

   readln(n);

   for i:=1 to n do

   read(c[i].a);

   readln;

   for i:=1 to n do

   read(c[i].b);

   readln;

   for i:=1 to n do

    begin

     if c[i].a<c[i].b then c[i].m:=c[i].a else c[i].m:=c[i].b;

     c[i].o:=i;

    end;

  end;

  procedure sort;

  var i,j,k,t:integer;

      temp:jd;

  begin

   for i:=1 to n-1 do

    begin

     k:=i;t:=c[i].m;

    for j:=i+1 to n do

     if c[j].m<t then begin t:=c[j].m;k:=j end ;

    if k<>i then begin temp:=c[i];c[i]:=c[k];c[k]:=temp end

    end;

  end;

  procedure playorder;

  var i,s,t:integer;

  begin

   fillchar(order,sizeof(order),0);

   s:=1;

   t:=n;

   for i:=1 to n do

    if c[i].m=c[i].a then begin order[s]:=i;s:=s+1 end

                     else begin order[t]:=i;t:=t-1;end;

  end;

  procedure calc_t;

  var i,t1,t2:integer;

  begin

   t1:=0;t2:=0;

   for i:=1 to n do

    begin

     t1:=t1+c[order[i]].a;

     if t2<t1 then t2:=t1;

     t2:=t2+c[order[i]].b;

    end;

  min:=t2;

  end;

  begin

   init;

   sort;

   playorder;

   calc_t;

   writeln(min);

   for i:=1 to n do

    write(c[order[i]].o,' ');

   writeln;

  end.

首页 上一页 下一页 尾页

相关推荐

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