洛谷 #2678. 跳石头

本文探讨了在特定问题场景下使用二分查找算法进行优化的方法。通过一个具体实例,即在一组数值中合并指定数量的数以最大化最小值,详细讲解了如何调整二分查找的边界条件避免死循环,并分享了实际编码过程中的调试记录。

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

题意

在 \(\ n\) 个数中合并 \(\ m\) 个,使 \(\ min\) 最大

题解

二分答案

调试记录

r = mid - 1; l = mid + 1,不然会死循环
二分好久没写了
#include <cstdio>
#include <algorithm>
#define maxn 50005

using namespace std;

int len, n, m, dis[maxn], org[maxn];

int main(){
	scanf("%d%d%d", &len, &n, &m);
	
	int pos, pre;
	for (int i = 1; i <= n; i++){
		scanf("%d", &pos);
		org[i] = dis[i] = pos - pre;
		pre = pos;
	}
	org[n + 1] = dis[n + 1] = len - pre;
	
	int l = 1, r = len, ans = -1;
	while (l <= r){
		int mid = (l + r) >> 1, avb = m;
		
		for (int i = 1; i <= n; i++)
			if (dis[i] < mid) avb--, dis[i + 1] += dis[i];
			
		for (int i = 1; i <= n + 1; i++) dis[i] = org[i];
			
		if (avb >= 0){
			ans = max(ans, mid);
			l = mid + 1;
		}
		if (avb < 0){
			r = mid - 1;
		}
	}
	printf("%d\n", ans);
	return 0;
}
题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用。 建议完成本题目后继续尝试 P1001、P1008。 另外强烈推荐新用户必读帖。 题目描述 超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景: ******** ************ ####....#. #..###.....##.... ###.......###### ### ### ........... #...# #...# ##*####### #.#.# #.#.# ####*******###### #.#.# #.#.# ...#***.****.*###.... #...# #...# ....**********##..... ### ### ....**** *****.... #### #### ###### ###### ############################################################## #...#......#.##...#......#.##...#......#.##------------------# ###########################################------------------# #..#....#....##..#....#....##..#....#....##################### ########################################## #----------# #.....#......##.....#......##.....#......# #----------# ########################################## #----------# #.#..#....#..##.#..#....#..##.#..#....#..# #----------# ########################################## ############ 输入格式 无 输出格式 如描述。 输入输出样例 输入 #1复制 输出 #1复制 ******** ************ ####....#. #..###.....##.... ###.......###### ### ### ........... #...# #...# ##*####### #.#.# #.#.# ####*******###### #.#.# #.#.# ...#***.****.*###.... #...# #...# ....**********##..... ### ### ....**** *****.... #### #### ###### ###### ############################################################## #...#......#.##...#......#.##...#......#.##------------------# ###########################################------------------# #..#....#....##..#....#....##..#....#....##################### ########################################## #----------# #.....#......##.....#......##.....#......# #----------# ########################################## #----------# #.#..#....#..##.#..#....#..##.#..#....#..# #----------# ########################################## ############
最新发布
07-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值