http://acm.hdu.edu.cn/showproblem.php?pid=2578
二分查找:
bool Find(int key){
int left = 1, right = tmp;
while(left <= right){
int mid = (left + right) >> 1;
if(a[mid] == key) return true;
else if(a[mid] > key)
right = mid - 1;
else if(a[mid] < key)
left = mid + 1;
}
return false;
}
AC_CODE:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int a[100010];
int tmp;
bool Find(int key){
int left = 1, right = tmp;
while(left <= right){
int mid = (left + right) >> 1;
if(a[mid] == key) return true;
else if(a[mid] > key)
right = mid - 1;
else if(a[mid] < key)
left = mid + 1;
}
return false;
}
int main(){
// freopen("in.txt", "r", stdin);
int cas;
scanf("%d",&cas);
while(cas--){
int n,k;
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
sort(a+1, a+1+n);
for(int i=1; i<=n; i++){
if(a[i] > k){
tmp = i - 1;
break;
}
}
int ans = 0;
for(int i=1; i<=tmp; i++){
int key = k - a[i];
if(Find(key)){
ans++;
if(i != 1 && a[i] == a[i - 1])
ans--;
}
}
printf("%d\n",ans);
}
return 0;
}