题目描述
给出n 个数a1…an,求两个数相加的绝对值的最小值
即求| ai + aj | (i 不等于j) 的最小值
输入
第一行一个数n
接下一行n 个数a1…an
输出
一行一个数ans, 两个数相加的绝对值的最小值
样例输入
5
-2 6 7 7 -8
样例输出
1
数据范围限制
• 对于40% 的数据,n <= 103,-106 <= ai <= 106。
• 对于80% 的数据,n <= 105,-106 <= ai <= 106。
• 对于100% 的数据,n <= 106,-106 <= ai <= 106。
分析
绝对值最接近1肯定最好嘛!(废话ing)。
先排序(必须的啊),然后用两个变量从两边往中间“靠近”。就是说如果当前两数相加的和(不是绝对值)是负数的话左边的变量往右靠,是正数的话右边的变量往左靠。打擂台就可以啦!
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
long long n,a[1000010],mn=0x3fffff;
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
//for(int i=1;i<=n;i++) cout<<a[i]<<' ';
long long l=1,r=n,x,y;
while(l<=r)
{
x=abs(a[l]+a[r]);
y=a[l]+a[r];
mn=min(mn,x);
if(y<=0) l++;
else r--;
}
cout<<mn;
fclose(stdin);
fclose(stdout);
return 0;
}