openjudge8207_和为给定数
时空限制 1000ms/64MB
描述
给出若干个整数,询问其中是否有一对数的和等于给定的数。
输入
共三行:
第一行是整数n(0 < n <= 100,000),表示有n个整数。
第二行是n个整数。整数的范围是在0到10^8之间。
第三行是一个整数m(0 <= m <= 2^30),表示需要得到的和。
输出
若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No。
样例输入
4 2 5 1 4 6
样例输出
1 5
代码
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,a[100005];
int search(int low,int high,int x){ //小于等于x的第一个位置
int mid;
while (low<=high){
mid=(low+high)/2;
if (x<=a[mid]) high=mid-1;
else low=mid+1;
}
return low;
}
int main(){
ios::sync_with_stdio(false);
cin>>n;
for (int i=1; i<=n; i++) cin>>a[i];
cin>>m;
sort(a+1,a+n+1);
for (int i=1,k; i<=n/2; i++){
k=search(i+1,n,m-a[i]); //k=lower_bound(a+i+1,a+n+1,m-a[i])-a;
if (m==a[i]+a[k]){
cout<<a[i]<<" "<<a[k]<<endl;
return 0;
}
}
cout<<"No\n";
return 0;
}