首先快排是要的,下面就是计算最小的体力耗费值了,其中我用到了冒泡排序,具体见下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| program fruit;
var a:array [0..10001]of longint;
i,j,k,n:integer;
t,s:longint;
flag:boolean;
procedure fastsort(l,r:integer);
var lx,rx,pi:integer;
begin
lx:=l;rx:=r;pi:=a[l];
while lx<rx do begin
while a[rx]>pi do dec(rx);
if lx<rx then begin
t:=a[rx];a[rx]:=a[lx];a[lx]:=t;inc(lx);
end;
while a[lx]<pi do inc(lx);
if lx<rx then begin
t:=a[rx];a[rx]:=a[lx];a[lx]:=t;dec(rx);
end;
end;
if l<lx-1 then fastsort(l,lx-1);
if r>rx+1 then fastsort(rx+1,r);
end;
begin
assign(input,'fruit.in');reset(input);
assign(output,'fruit.ans');rewrite(output);
readln(n);
for i:=1 to n do read(a[i]);
fastsort(1,n);
s:=0;a[0]:=0;
for i:=1 to n do begin
s:=s+a[i]+a[i-1];a[i]:=a[i-1]+a[i];
for k:=i to n-1 do
if a[k]>a[k+1] then begin
t:=a[k];a[k]:=a[k+1];a[k+1]:=t;
end;
end;
dec(s,a[1]);
writeln(s);
close(input);close(output);
end.
|
其中还有许多可以优化的地方,如:可以用t:=a[i];a[i]:=a[n];a[n]:=t;来减少后面的排序次数,又数组已是有序的了故还可在冒泡排序上优化,可置一布尔型变量flag来提前结束排序.
但十个测试点都过了就不做了.