列表

详情


NC206199. MinValue

描述

有一天,老师告诉多多:绝对值指一个数在数轴上所对应点到原点的距离。
接下来老师给多多一个由 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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 41ms, 内存消耗: 2016K, 提交时间: 2020-06-20 11:02:43

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int N=1e5+7;
struct node{int id,val;}k[N];
bool cmp(node x,node y) {
	if(x.val==y.val) return x.id<y.id;
	return x.val<y.val;
}
int main() {
	int n;cin>>n;
	for(int i=1;i<=n;i++) scanf("%d",&k[i].val),k[i].id=i;
	sort(k+1,k+1+n,cmp);
	int l=1,r=n;
	int minn=1e9,pos;
	while(l<r) {
		int s=abs(k[l].val+k[r].val);
		if(s<minn) minn=s,pos=k[l].id+k[r].id;
		else if(s==minn) pos=min(pos,k[l].id+k[r].id);
		if(k[r].val==k[r-1].val) r--;
		else if(k[l].val+k[r].val>=0) r--;
		else if(k[l].val+k[r].val<0) l++;
	} 
	cout<<minn<<" "<<pos<<endl;
} 

C++14(g++5.4) 解法, 执行用时: 141ms, 内存消耗: 5724K, 提交时间: 2020-06-19 16:35:16

#include<bits/stdc++.h>
#include<cmath>
using namespace std;
const int N=1e5+5,Inf=1e6;
int main(){
	int n,x;
	map<int,int> mp;
	int a=2*Inf,b=2*Inf;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		auto ans=mp.lower_bound(-x);
		if(ans!=mp.end()){
			int cur=abs(x+ans->first);
			if(a>cur) a=cur,b=i+ans->second;
			else if(a==cur) b=min(b,i+ans->second);
		}
		if(ans!=mp.begin()){
			--ans;
			int cur=abs(x+ans->first);
			if(a>cur) a=cur,b=i+ans->second;
			else if(a==cur) b=min(b,i+ans->second);
		}
		mp.insert(make_pair(x,i));
	}
	cout<<a<<" "<<b;
	return 0;
} 

上一题