和为给定数(summator)
题目描述
数完正方形,大家决定休息一下,玩个游戏,首先由小天同学给出若干个整数,然后夏同学再给出一个,其它同学在小天同学的整数中查找其中是否有一对数的和等于夏同学给定的数。
输入格式
共三行:
第一行是整数 �(0<�≤100,000)n(0<n≤100,000) ,表示有 �n 个整数。
第二行是 �n 个整数。整数的范围是在 00 到 100,000,000100,000,000 之间。(�n 个数各不相同)
第三行是一个整数 �(0≤�≤2,000,000,000)m(0≤m≤2,000,000,000) ,表示需要得到的和。
输出格式
若存在和为 �m 的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行"No"。
样例
输入#1
4
2 5 1 4
6
Copy
输出#1
1 5
Copy
数据范围
- 20%20% 的数据满足 0<�≤100,0<�≤20000<n≤100,0<m≤2000
- 50%50% 的数据满足 0<�≤10,000,0<�≤20,000,0000<n≤10,000,0<m≤20,000,000
- 100%100% 的数据满足 0<�≤100,000,0<�≤2,000,000,0000<n≤100,000,0<m≤2,000,000,000
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int fun(int left,int right,int t){
while(left<=right)
{
int h=(left+right)/2;
if(a[h]==t){ return h; }
if(t<a[h]){right=h-1; }
else if(t>a[h]) {left=h+1;}
}
return -1;
}
int main(){
int n,i,j;
long long m;
cin>>n;
for(i=1;i<=n;i++){ cin>>a[i]; }
sort(a+1,a+1+n);
cin>>m;//m最大是20亿
if(m>2000000000){cout<<"No";return 0;}
for(i=1;i<=n;i++){
if(m-a[i]<=100000000){
int k=m-a[i];
int h=fun(i+1,n,k);
if(h!=-1){
cout<<a[i]<<" "<<a[h];
return 0;
}
}
}
cout<<"No";
}