pascl大神请进,中犇也可以来看一看

2025-05-18 16:18:22
推荐回答(1个)
回答(1):

var
n,i:integer;
t:array[1..100] of integer;
b:array[1..100] of boolean; {状态数组}
f:text;
s:longint;
st:string;

procedure next(m:integer;ss:longint;sst:string);
var
k:integer;
s0:string;
begin
if m=n then begin
if ss s:=ss;
st:=sst;
for k:=1 to n do
if not b[k] then begin
str(k:0,s0);
st:=st+' '+s0;
end;
end;
end
else for k:=1 to n do if not b[k] then
begin
b[k]:=true;
str(k:0,s0);
next(m+1,ss+t[k]*(n-m),sst+' '+s0);
{第一个人接水,后面有9人等待,......}
b[k]:=false;
end;
end;

begin
assign(f,'排队接水.in'); reset(f);
readln(f,n);
for i:=1 to n do read(f,t[i]);
close(f);
for i:=1 to n do b[i]:=false;
s:=9999999;
st:='';
next(1,0,'');
writeln(st);
writeln(s/n:10:2);
end.
{这是穷举所有可能的总体最优递归解法!
从计算结果看,将接水时间从小到大排序,
按接水时间短的优先打水,最后所得等待时间最短}

计算结果:
3 9 2 7 8 1 4 6 10 5
243.90