Description
聪明的你们一定会求两个数的和啦,是时候考验考验大家啦。
Input
输入包含多组测试数据,对于每组测试用例:
输入一个正整数n( 0 < n < 105 )。
接着输入n个整数Ai( |Ai| < 108 )。
接着输入一个整数k( |Ai| < 108 )。
问:从n个整数中取出两个数a, b(a != b),使得a + b = k的组合种数是多少?
Output
输出组合种数。每组数据占一行。
Sample Input
4
1 2 2 3
5
5
1 2 3 4 5
6
Sample Output
1
2
#include <stdio.h>
#include <string.h>
#include <map>
#include<algorithm>
#define K 11111111
using namespace std;
int num[K],k;
int BinSearch(int Array[],int SizeOfArray,int key){
int low=0,high=SizeOfArray-1;
int mid;
while(low<=high){
mid=(low+high)/2;
if(key==Array[mid]){
return mid;
}
if(key<Array[mid])
high=mid-1;
if(key>Array[mid])
low=mid+1;
}
return -1;
}
int main(){
int n,i,b,sum;
while(scanf("%d",&n)!=EOF){
sum=0;
for(i=0;i<n;i++){
scanf("%d",&num[i]);
}
sort(num,num+n);
scanf("%d",&k);
map<int,int> m;
for(i=0;i<n;i++){
if(m[num[i]]){
continue;
}
b=k-num[i];
if((BinSearch(num,n,b)>-1)&&b!=num[i]){
sum++;
m[b]=1;
m[num[i]]=1;
}
}
printf("%d\n",sum);
}
return 0;
}