2.sum

题目描述
给出n 个数a1…an,求两个数相加的绝对值的最小值
即求| ai + aj | (i 不等于j) 的最小值

输入

第一行一个数n
接下一行n 个数a1…an

输出

一行一个数ans, 两个数相加的绝对值的最小值

样例输入

5
-2 6 7 7 -8

样例输出

1

数据范围限制

• 对于40% 的数据,n <= 103,-106 <= ai <= 10^6。
• 对于80% 的数据,n <= 105,-106 <= ai <= 10^6。
• 对于100% 的数据,n <= 106,-106 <= ai <= 10^6。

正解
先把它们都变成正数,再快排,最后变回来,相邻的两个相加,求出绝对值的最小值
AC代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;
struct stu
{
   
	int ans,num;
}a[1000005];
bool cmp(stu x,stu y)
{
   
	return x.ans<y.ans;
}
int main()
{
   
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
   
		cin>>a[i].ans;
		if(a[i].ans<0){
   a[i].ans=-a[i].ans;a[i].num=1;}//看看是否为负数
	}
	sort(a+1,a+n+1,cmp);//快排
	m=2147483647;
	for(int i=1;i<=n;i++)
	{
   
		if(a[i].num==1)a[i].ans=-a[i].ans;//还原
		if(i>1)m=min(m,abs(a[i-1].ans+a[i].ans));//找绝对值的最小值 
	}
	cout<<m;
	return 0;
}

下面附本次比赛的其它题目

2020.03.04模拟赛12(第一题)
2020.03.04模拟赛12(第二题)
2020.03.04模拟赛12(第三题)
2020.03.04模拟赛12(第四题)
2020.03.04模拟赛12(第五题)
2020.03.04模拟赛12(总结)

谢谢观看