蓝桥杯备考:二分算法之牛可乐和魔法封印
·


这道题找大于等于x1并且小于等于y1的数字个数
我们可以先二分查找大于等于x1的数的最小坐标,然后再二分小于等于x2的最大坐标
然后求区间长度就对了
当然,我们需要注意,比如我们查找大于等于5,我们的数组1,2,3,4 最大只能查找到4,它是不符合要求的,我们直接返回0就行了
同样如果是 7 8 9 10 查找小于等于5的,也只能查到7,也直接返回0
好的,既然如此,我们来写一下代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
int n;
int a[N];
int binary_search(int x,int y)
{
int l = 1,r = n;
while(l<r)
{
int mid = (l+r)/2;
if(a[mid]>=x) r=mid;
else l = mid+1;
}
if(a[l]<x) return 0;
int tmp = l;
l=1,r=n;
while(l<r)
{
int mid = (l+r+1)/2;
if(a[mid]<=y) l=mid;
else r = mid-1;
}
if(a[l] > y) return 0;
return l-tmp+1;
}
int main()
{
cin >> n;
for(int i = 1;i<=n;i++)
{
cin >> a[i];
}
sort(a+1,a+1+n);
int q;cin >> q;
while(q--)
{
int x1,x2;cin >> x1 >> x2;
cout << binary_search(x1,x2) << endl;
}
return 0;
}
更多推荐
所有评论(0)