Min Value(二分)

Min Value(二分)

传送门

思路:排序后二分,注意下细节+特判。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,inf=0x3f3f3f3f;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first 
#define se second
struct p{
  int x,id;
}a[N];
bool cmp(p a,p b){
	return a.x==b.x?a.id<b.id:a.x<b.x;
}
int b[N];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i].x),a[i].id=i;
    sort(a+1,a+n+1,cmp);
    int ans=1e9,w=0;
    for(int i=1;i<=n;i++) b[i]=a[i].x;
    for(int i=1;i<=n;i++){
        int p=lower_bound(b+1,b+n+1,-b[i])-b;
        if(p==n+1) p--;//查不到的情况.
        for (int j=max(p-1,1);j<=min(n,p+1);j++){
            if(i==j) continue;//需要特判.
             int tmp=abs(b[i]+b[j]),w_=a[i].id+a[j].id;
            if(tmp<ans){
                 ans=tmp,w=w_;
            }
            else if(tmp==ans&&w_<w) w=w_; 
        }
    }
    printf("%d %d\n",ans,w);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/106750352