题目描述
给定 $n$ 个整数 $a_1,a_2,⋯,a_n$,并且保证 $a_1<a_2<⋯<a_n$,再给定一个目标值 $t$,请判断是否能从数列中挑出两个不同的数 $a_i$ 与 $a_j$,使得 $a_i+a_j=t$。
输入描述
第一行:单个整数 $n$;
第二行:$n$ 个整数 $a_1,a_2,⋯,a_n$;
第三行:单个整数 $t$。
数据范围
- 对于30%的数据,$1≤n≤3000$;
- 对于60%的数据,$1≤n≤100,000$;
- 对于100%的数据,$1≤n≤1,000,000$;
- $−1,000,000,000≤a_i≤1,000,000,000$;
- $−2,000,000,000≤t≤2,000,000,000$。
输出描述
- 如果存在一种组合满足要求,输出
Yes
; - 否则,输出
No
。
输入样例
4
1 3 5 7
8
输出样例
Yes
#include <iostream>
#include<algorithm>
using namespace std;
int a[1000005];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
int t;
cin>>t;
for(int i=0;i<n;i++){
int x=t-a[i];
int p=lower_bound(a+i+1,a+n,x)-a;
if(p<n){
if(a[p]==x){
cout<<"Yes";
return 0;
}
}
}
cout<<"No";
return 0;
}