codeforces CF 706 B Interesting drink

分析:

        首先考虑暴力算法,对于每个q,如果每次都遍历n,则时间复杂度O(n²),对1<q,n<100000这种数量级来说,取极限值必然超时。

        因此采用二分搜索。首先将x数组排序,(二分搜索要保证序列有序)。所以问题转化为,对每次询问q,在商店序列x中二分搜索合适的区间。

代码:

/*

    Input
    5
    3 10 8 6 11
    4
    1
    10
    3
    11
    Output
    0
    4
    1
    5


*/
#include<bits/stdc++.h>
using namespace std;

const int maxn = 100005;
int n, q;
int x[maxn];
int m[maxn];

int BinarySearch(int ele) {
	int ll = 0;
	int hh = n;
	int mm;

	while (ll < hh) {
		mm = ll + (hh - ll) / 2;
		if (x[mm] <= ele) {
			ll = mm + 1;
		}
		else if (x[mm]>ele) {
			hh = mm;
		}
	}
	return ll;
}
int main() {
	scanf("%d", &n);
	for (int i = 0; i<n; ++i) {
		scanf("%d", &x[i]);
	}

	scanf("%d", &q);
	for (int i = 0; i<q; ++i) {
		scanf("%d", &m[i]);
	}
	sort(x, x + n);
	for (int i = 0; i<q; ++i) {
		printf("%d\n", BinarySearch(m[i]));
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值