题目链接
题解:
要在一个数列里面找两个数的和等于X,可以用两个for循环,但是会超时,所以要想到用二分的思想来解决。怎么二分,类似于OpenJudge 3441:Values whose Sum is 0,把A+B=X,转化为A=X-B,去数列里面找是否有满足这个条件的数。
并且因为已经排过序了,得到的第一个数对中较小数就是最小的
代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAX_N=1e5+7;
int a[MAX_N],n,m;
bool bs(int x,int l,int r)
{
while(l<=r){
int mid=l+(r-l)/2;
if(x<a[mid])
r=mid-1;
else if(x==a[mid])
return true;
else
l=mid+1;
}
return false;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
sort(a,a+n);
int i;
for(i=0;i<n-1;i++){
if(bs(m-a[i],i+1,n-1)) //二分区间是变化的。
{
printf("%d %d\n",a[i],m-a[i]);
break;
}
}
if(i==n-1)
printf("No\n");
return 0;
}