Min Value

链接:https://ac.nowcoder.com/acm/contest/5929/B
来源:牛客网

题目描述

有一天,老师告诉多多:绝对值是指一个数在数轴上所对应点到原点的距离。 接下来老师给多多一个由 N 个数组成的序列
a1,a2,a3,······,an-1,an,他想让多多从中任选两个数 ai 和 aj,使得 ai + aj 的绝对值最小,并且计算出 i

  • j 的值,其中 i ≠ j。 由于老师给出的序列太长,多多无法完成这个任务,请你帮助他。 输入描述: 输入第一行包含一个正整数 N (2 ≤ N ≤ 100000) 接下来 N 行,每行一个整数 ai (1 ≤ i ≤ N,-106 ≤ ai ≤ 106) 输出描述:
    输出两个数,中间用空格分开,ai + aj 的绝对值的最小值和 i + j(如果有多组 i 和 j 满足条件,输出 i + j 最小的一组)

示例1

输入

5
-2
6
7
7
-8

输出

1 8

说明

满足最小值的有两种情况,选(3,5)或(4,5),(3 + 5) < (4 + 5),因此输出 1 和 8

AC代码:

#include
#include

using namespace std;
const int maxn = 100010;

struct node
{
     
	int num;
	int id;
	bool operator < (const node b)const
	{
     
		if (num != b.num)
			return num < b.num;
		else
			return id > b.id;
	}
}a[maxn];
int n, ans1 = 0x3f3f3f, ans2 = 0x3f3f3f;
int b[maxn];



int main()
{
     
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int i, j, tmp;
	cin >> n;
	for (i = 0; i < n; ++i)
	{
     
		cin >> a[i].num;
		b[i] = a[i].num;
		a[i].id = i + 1;
	}
	sort(a, a + n);
	sort(b, b + n);
	for (i = 0; i < n; ++i)
	{
     
		tmp = lower_bound(b, b + n, -a[i].num) - b;
		if (tmp == n)tmp--;
		for (j = max(tmp - 1, 0); a[j].num <= a[tmp].num && j < n; ++j)
		{
     
			if (i == j)
				continue;
			if (abs(a[i].num + a[j].num) < ans1)
			{
     
				ans1 = abs(a[i].num + a[j].num);
				ans2 = a[i].id + a[j].id;
			}
			else if (abs(a[i].num + a[j].num) == ans1 && ans2 > a[i].id + a[j].id)
			{
     
				ans2 = a[i].id + a[j].id;
			}
		}
	}
	cout << ans1 << " " << ans2 << endl;
	return 0;
}

/*
5
-2
6
7
7
-8
*/

你可能感兴趣的:(二分搜索)