蓝桥杯备赛--二分查找

本文介绍了如何运用二分查找法解决蓝桥杯比赛中的找数问题,同时探讨了在限制灵力消耗的情况下,如何有效地搬走连续的要石,求解最小消耗的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法训练-找数2
题目地址 http://lx.lanqiao.cn/problem.page?gpid=T1666

【问题描述】在一个小到大的有序序列中(不存在重复数字),查找某个数所在的位置。如果该数不在该数列中,输出其应插入点的位置。
在这里插入图片描述

#include<cstdio>

int a[10100];
int N;

int bin_search(int x) {
	int l = 0, r = N-1, res = 0;
	while(l <= r) {		
		int mid = l + r >> 1;
		if(a[mid] < x) {
			l = mid + 1;res = mid;
		} else {
			r = mid - 1;
		}
	}
	return res;
}

int main() {
	scanf("%d", &N);
	for(int i = 0; i < N; i++) {
		scanf("%d", &a[i]);
	}
	int x, idx;
	scanf("%d", &x);
	idx = bin_search(x);
	if(idx == 0 && a[idx] > x || a[idx] == x) {
		printf("%d\n", idx+1); //从1开始数,故+1,要么找到这个数,要么插入第一个(这个数最小) 
	} else {
		printf("%d\n", idx+2); //插入在这个数后面 
	}
	return 0;
} 

算法训练 搬走要石
题目地址http://lx.lanqiao.cn/problem.page?gpid=T2400

问题描述
  住在有顶天的天人Tensi对自己的住处很不满。终于有一天她决定把门前碍眼的要石通通丢掉(怒扔要石)。控制要石自然是很容易的事,不过也会消耗灵力。假设搬走一块质量为1的要石会消耗1点灵力,而且由于要石都是连着放置的缘故所以每次除了搬走一颗,也可以搬走连续的任意数量的要石,自然质量是算在一起的。现在Tensi准备最多使用M次灵力,但是她太懒……所以每次只会使用同量的灵力, 也因为她太烂,所以也不愿意多花一点灵力……现在很懒的Tensi需要你帮她计算最少一次需要消耗多少灵力,能够在M次内把所有要石都丢到人间去……
  在这里插入图片描述

#include<cstdio>

int M, N; 
int a[1010];

int enough(int t) {
	int idx = 0;
	for(int i = 0; i < M; i++) {
		int sum = 0;
		while(sum + a[idx] <= t && idx <= N-1) {
			sum += a[idx];
			idx++;
		};
	}
	if(idx == N) return 1;
	return 0;
}

int bin_search() {
	int l = 0, r = 1000000, res = 1000000;
	while(l <= r) {
		int mid = l + r >> 1;
		//printf("%d %d %d\n", l, mid, r);
		if(!enough(mid)) {
			l = mid + 1;
		} else {
			r = mid - 1;
			res = mid;
		}
	}
	return res;
}

int main() {
	scanf("%d%d", &N, &M);
	for(int i = 0; i < N; i++) {
		scanf("%d", &a[i]);
	}
	int res = bin_search();
	printf("%d\n", res);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值