day3

二分查找(折半查找,递归实现)

经典例题

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;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值