2020寒假【gmoj2192】【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 <= 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;
}

发布了110 篇原创文章 · 获赞 100 · 访问量 8031

猜你喜欢

转载自blog.csdn.net/dglyr/article/details/104826237
今日推荐