排队取水问题

来源:互联网 发布:软件借贷不还会怎么样 编辑:程序博客网 时间:2024/05/17 08:24

  题目:有N个人排队到M个水龙头去打水,他们装满水桶的时间为T1,T2,…,Tn为整数且各不相等,应如何安排他们的打水顺序才能使他们花费的总时间最少?
  分析:花费时间最少,不就是说等待时间最少吗?一看数据才1000,选择排序足以,然后把它们按顺序分别放到M个水龙头就可以了。

  1、读入装水时间。

  2、对装水时间进行排序。

  3、把装水时间按顺序分别放到各自水龙头,每轮是M个。一直到n结束。

  输入样例:8

          3 2 1 4 5 7 6 8

  输出样例:54


  每个水龙头每人花费时间是等待时间+打水时间,等待时间就是前面所有人花费时间。用数组S表示每个水龙头每个人花费时间s[j]:=s[j]+a[i]。把花费时间S,进行累加zs:=zs+s[i]

for i:=1 to n do
    begin
      inc(j);
      if j=m+1 then j:=1;
      s[j]:=s[j]+a[i];
      zs:=zs+s[j];
    end;

参考程序:

var n,m,i,j,t,k:longint;zs:longint;
    a,s:array[1..1000]of longint;

procedure sort;
var i,j,m:longint;
begin
  for i:=1 to n-1 do
    for j:=i+1 to n do
      if a[i]>a[j] then
        begin
          m:=a[i];a[i]:=a[j];a[j]:=m;
        end;
end;
begin
  readln(n,m);
  for i:=1 to n do
    read(a[i]);
  sort;
  zs:=0;
  for i:=1 to n do
    begin
      inc(j);
      if j=m+1 then j:=1;
      s[j]:=s[j]+a[i];
      zs:=zs+s[j];
    end;
  writeln(zs);
end.

改进:二维数组优化

参考程序:

var n,m,i,j,t,k:longint;s,zs:int64;
    a:array[1..1000]of longint;
    b:array[0..1000,0..1000]of longint;
procedure sort;
var i,j,m:longint;
begin
  for i:=1 to n-1 do
    for j:=i+1 to n do
      if a[i]>a[j] then
        begin
          m:=a[i];a[i]:=a[j];a[j]:=m;
        end;
end;
begin
  readln(n,m);
  for i:=1 to n do
    read(a[i]);
  sort;
  t:=round(n/m);
  k:=0;
  for j:=1 to t do
    for i:=1 to m do
      begin
        inc(k);
        b[i,j]:=a[k];
      end;
  zs:=0;
  for i:=1 to m do
    begin
      s:=0;
      for j:=1 to t do
       if b[i,j]>0 then
        begin
          s:=s+b[i,j-1];
          zs:=zs+s+b[i,j];
        end;
    end;
  writeln(zs);
end.

0 0
原创粉丝点击