回 帖 发 新 帖 刷新版面

主题:第十一届奥赛(初赛)程序阅读第2题(求讲解过程)

2. var  a : array [1..50] of integer;
n, i, sum : integer;
2. Var a : array [1..50] of integer;
n, i, sum : integer;
procedure work(p, r: integer);
var  i, j, temp : integer;
begin
if p < r then begin
i := p - 1;
for j := p to r - 1 do
if a[j] >= a[r] then begin
inc(i);
temp := a[i]; a[i] := a[j]; a[j] := temp;
end;
temp := a[i + 1]; a[i + 1] := a[r]; a[r] := temp;
work(p, i);
work(i + 2, r);
end;
end;
begin
read(n);
for i := 1 to n do read(a[i]);
work(1, n);
for i := 1 to n - 1 do sum := sum + abs(a[i + 1] - a[i]);
writeln(sum);
end.
输入:10 23 435 12 345 3123 43 456 12 32 -100
输出:
我是个初学者,希望得到大家的帮助!谢谢

回复列表 (共1个回复)

沙发

看到这题目,首先反映到的是有判断、有交换还有递归。
基本上就可以猜是排序了。
然后再仔细阅读一下,可以看出
i总小于j,而a[j]>a[r]则将a[j]提前放,可以猜测是从大到小排序。

之后的递归是不包含i的,凭感觉也该知道a[i]的位置在递归中不会再被交换了。
那么就再检查一下a[i]在这一通交换中是否得到的是第i大的数字。
显然,是的。

所以,这个过程是一个排序的过程最后结果就等于极差的相反数。

我来回复

您尚未登录,请登录后再回复。点此登录或注册