NC206199. MinValue
描述
输入描述
输入第一行包含一个正整数 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 和 8C++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; }