排队接水
源程序名 water.???(pas, c, cpp) 可执行文件名 water.exe 输入文件名 water.in 输出文件名 water.out |
【问题描述】
有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
【输入】
输入文件共两行,第一行为n;第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。
【输出】
输出文件有两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
【样例】
water.in water.out
10 3 2 7 8 1 4 9 6 10 5
56 12 1 99 1000 234 33 55 99 812 291.90
=====================
贪心
贪心策略的形成
T:=T1+(T1+T2)+(T1+T2+T3)+……
T:=(N-1)*T1+(N-2)*T2+……
=====================
var
n:longint;
t:array[1..5000]of longint;
old:array[1..5000]of longint;
procedure init;
begin
assign(input,'water.in');
assign(output,'water.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure main;
var
i,j:longint;
tem:longint;
ans:longint;
begin
readln(n);
for i:=1 to n do
begin
read(t[i]);
old[i]:=i;
end;
for i:=1 to n-1 do
for j:=i+1 to n do
begin
if t[i]>t[j] then
begin
tem:=t[i];
t[i]:=t[j];
t[j]:=tem;
tem:=old[i];
old[i]:=old[j];
old[j]:=tem;
end;
end;
for i:=1 to n-1 do
write(old[i],' ');
writeln(old[n]);
ans:=0;
for i:=1 to n do
begin
ans:=ans+t[i]*(n-i);
end;
writeln(ans/n:0:2);
end;
begin
init;
main;
terminate;
end.