(纪中)2192. sum

(File IO): input:sum.in output:sum.out
时间限制: 1000 ms 空间限制: 65536 KB 具体限制
Goto ProblemSet


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


输入
第一行一个数 n n
接下一行 n n 个数 a 1.. a n a1..an

输出
一行一个数 a n s ans , 两个数相加的绝对值的最小值


样例输入
5
-2 6 7 7 -8

样例输出
1


数据范围限制
• 对于 40 40 % 的数据, n < = 1 0 3 1 0 6 < = a i < = 1 0 6 n <= 10^3,-10^6 <= ai <= 10^6
• 对于 80 80 % 的数据,$n <= 105,-106 <= ai <= 10^6。
• 对于 100 100 % 的数据, n < = 1 0 6 1 0 6 < = a i < = 1 0 6 n <= 10^6,-10^6 <= ai <= 10^6


解题思路
先用每个数的绝对值作关键字排个序,再每两个相邻的数相加求最小和。


代码

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,a[1000000],ans;
bool cmp(int x,int y)
{
	return abs(x)<abs(y);
}
int main()
{
	freopen("sum.in","r",stdin);
    freopen("sum.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1,cmp);
    ans=2147483647;
    for(int i=2;i<=n;i++)
    {
    	if(abs(a[i]+a[i-1])<ans)
    	ans=abs(a[i]+a[i-1]);
	}
    printf("%d",ans);
}
发布了119 篇原创文章 · 获赞 8 · 访问量 4929

猜你喜欢

转载自blog.csdn.net/kejin2019/article/details/104694483
sum