二分查找(折半查找,递归实现)
经典例题
HDU的每个人都知道男孩的数量比女孩的数量多。但是现在,每个男孩都想和漂亮女孩约会。女生喜欢和智商较高的男孩约会。为了测试男孩的智商,女孩制造问题,而能正确解决问题、花费
更少的时间的男孩可以和他们约会。
问题是 :给你 n 个正整数和整数 k。您需要计算方程 x = y = k 有多少个不同的解。x 和 y 必须表示为给定的 n 个整数。如果 x0 != x1 或 y0!= y1,两种解决方案是不同的。
现在聪明的 Acmers,尽快解决问题。所以你可以和漂亮女孩约会多么美妙啊!
输入
第一行包含整数 T。然后 T 例随之而来。每个情况以两个整数 n(2 <= n <= 100000) 开头,k(0 <= k < 2=31)。然后下一行包含 n 个整数。
输出
对于每种情况,输出方程的解数。
示例输入
2
5 4
1 2 3 4 5
8 8
1 4 5 7 8 9 2 6
示例输出
3
5
ac代码(第一道题目改了挺多遍的)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10 ;
int a[N];
int T,n,k;
bool check(int x){ //二分查找,查找一个数组的元素,并返回所在的位置的下标(必须是有序数组)
int l=0,r=n-1; //l-左侧下标,r-右侧下标
while(l<r)
{
int mid=l+r>>1; //定义中间位下标
if(a[mid]==x) return 1;
else if(a[mid]>x) r=mid;
else l=mid+1;
}
return 0;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
int ans=0;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n); //需要排序
for(int i=0;i<n;i++)
{
if(check(k-a[i]))
{
ans++;
if(a[i]==a[i-1]&&i!=0) ans--;
}
}
cout<<ans<<endl;
}
}