题目描述
给出n 个数a1..an,求两个数相加的绝对值的最小值
即求| ai + aj | (i 不等于j) 的最小值
输入
第一行一个数n
接下一行n 个数a1..an
输出
一行一个数ans, 两个数相加的绝对值的最小值
样例输入
5
-2 6 7 7 -8
样例输出
1
数据范围限制
• 对于40% 的数据,n <= 10^3,-10^6 <= ai <= 10^6。
• 对于80% 的数据,n <= 10^5,-10^6 <= ai <= 10^6。
• 对于100% 的数据,n <= 10^6,-10^6 <= ai <= 10^6。
TJ
先用每个数的绝对值作关键字排个序,再每两个相邻的数相加求最小和。
BC
var
n,i,ans:longint;
a:array[1..1000000]of longint;
procedure kp(l,r:longint);
var
i,j,mid,t:longint;
begin
i:=l;
j:=r;
mid:=abs(a[(l+r)div 2]);
repeat
while abs(a[i])<mid do inc(i);
while abs(a[j])>mid do dec(j);
if i<=j then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
inc(i);
dec(j);
end;
until i>j;
if l<j then kp(l,j);
if i<r then kp(i,r);
end;
begin
assign(input,'sum.in');reset(input);
assign(output,'sum.out');rewrite(output);
readln(n);
for i:=1 to n do read(a[i]);
kp(1,n);
ans:=maxlongint;
for i:=2 to n do if abs(a[i]+a[i-1])<ans then ans:=abs(a[i]+a[i-1]);
writeln(ans);
close(input);close(output);
end.