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(总结)