问题描述
给定一个包含n个整数的数组a,保证每个数字不重复,从中取两个不同的数,使得他们的和值为s。
求一共有多少种不同的选取方案?
输入格式
输入第一行两个整数n(n2<=n<=10^ 6),s(1<=s<=10^9)
接下来一行输入n个整数,第i个数表示ai(-10^ 9<=ai<= 10^ 9)
输出格式
输出一行一个整数表示满足条件的方案数
样例输入
10 7
-3 -2 -4 4 8 9 3 -1 10 0
#include <iostream>
using namespace std;
typedef long long ll;
const ll N=1e7;
ll a[N],n,s;
int cnt;
bool falg;
bool binary_search(ll l,ll r,ll x){
while(l<=r){
ll mid=(l+r)>>1;
if(a[mid]==x){
return true;
break;//这里如果找到的话退出循环!!!
}if(a[mid]<x){
l=mid+1;
}if(a[mid]>x){
r=mid-1;
}
}
return false;
}
int main()
{
cin>>n>>s;
for(int i=0;i<n;i++){
cin>>a[i];
}
//二分法之前一定要记得排序
sort(a,a+n);
for(int i=0;i<n;i++){
if(binary_search(i+1,n-1,s-a[i])){
cnt++;//找到一个数就行了!
}
}
cout<<cnt<<endl;
} // namespace std;
如果是一个数组中选择数字的话,最好不要有一种真的选的思维,找条件试试