【二分搜索 C/C++】洛谷 P1873 EKO / 砍树

2025 - 02 - 19 - 第 55 篇
Author: 郑龙浩 / 仟濹(CSND)
【二分搜索】

文章目录

  • 洛谷 P1873 EKO / 砍树
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例 #1
      • 输入 #1
      • 输出 #1
    • 输入输出样例 #2
      • 输入 #2
      • 输出 #2
    • 说明/提示
    • 题目中的部分变量
    • 思路
    • 代码

洛谷 P1873 EKO / 砍树

题目描述

伐木工人 Mirko 需要砍 M M M 米长的木材。对 Mirko 来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一般砍伐森林。不过,Mirko 只被允许砍伐一排树。

Mirko 的伐木机工作流程如下:Mirko 设置一个高度参数 H H H(米),伐木机升起一个巨大的锯片到高度 H H H,并锯掉所有树比 H H H 高的部分(当然,树木不高于 H H H 米的部分保持不变)。Mirko 就得到树木被锯下的部分。例如,如果一排树的高度分别为 20 , 15 , 10 20,15,10 20,15,10 17 17 17,Mirko 把锯片升到 15 15 15 米的高度,切割后树木剩下的高度将是 15 , 15 , 10 15,15,10 15,15,10 15 15 15,而 Mirko 将从第 1 1 1 棵树得到 5 5 5 米,从第 4 4 4 棵树得到 2 2 2 米,共得到 7 7 7 米木材。

Mirko 非常关注生态保护,所以他不会砍掉过多的木材。这也是他尽可能高地设定伐木机锯片的原因。请帮助 Mirko 找到伐木机锯片的最大的整数高度 H H H,使得他能得到的木材至少为 M M M 米。换句话说,如果再升高 1 1 1 米,他将得不到 M M M 米木材。

输入格式

1 1 1 2 2 2 个整数 N N N M M M N N N 表示树木的数量, M M M 表示需要的木材总长度。

2 2 2 N N N 个整数表示每棵树的高度。

输出格式

1 1 1 个整数,表示锯片的最高高度。

输入输出样例 #1

输入 #1

4 7
20 15 10 17

输出 #1

15

输入输出样例 #2

输入 #2

5 20
4 42 40 26 46

输出 #2

36

说明/提示

对于 100 % 100\% 100% 的测试数据, 1 ≤ N ≤ 1 0 6 1\le N\le10^6 1N106 1 ≤ M ≤ 2 × 1 0 9 1\le M\le2\times10^9 1M2×109,树的高度 ≤ 4 × 1 0 5 \le 4\times 10^5 4×105,所有树的高度总和 > M >M >M

题目中的部分变量

tree_num - 树木数量
trees[] - 每个树木的高度
tree_sum - 需要的木材总长度
max_JHight - 锯片的最高高度
max_TreeHight - 树木最高高度
tree_NewSum - 存储当前锯片高度砍的树木高度之和

思路

理一下思路,首先,刚开始是没想到这个题怎么做的,我看到标签写的**“二分算法”**,然后往这方面想才有了思路。

首先,该题要求的是:max_hight锯片的最高高度,这个锯片的高度肯定是有一个区间的,所以只需要在这个区间(1 ~ 最高的树木高度)内查找到一个符合条件的值即可。

即使用二分搜索法在区间 [ 1 —— max_TreeHight ] 内寻找符合**条件(下面写了什么条件)**的值(或叫高度)

这个所谓条件就是:

锯下来的所有木材之和 大于等于 需要的木材总长度

注意数据范围

1≤N≤106,1≤M≤2×109,树的高度 ≤4×105,所有树的高度总和 >M

所以 long long

还有一些细节问题

关于一些特殊情况以及细节,我已经在写代码的时候进行了标注和注释

既然理清思路,就开始写代码了,代码如下

代码

//洛谷P1873 KEO/砍树
// 2025-02-18
// 郑龙浩 / 仟濹(CSDN)
// tree_num - 树木数量
// trees[] - 每个树木的高度
// tree_sum - 需要的木材总长度
// max_JHight - 锯片的最高高度
// max_TreeHight - 树木最高高度
// tree_NewSum - 存储当前锯片高度砍的树木高度之和
#include <iostream>
#include <algorithm>
using namespace std;
// 二分搜索符合 锯下来的所有木材之和 **大于等于** 需要的木材总长度 的高度
long long binary_searchSelf( long long trees[], long long tree_num, long long tree_sum, long long max_TreeHight ){long long left = 0, right = max_TreeHight, middle; // 左定位 右定位 中间定位long long tree_NewSum; // 存储当前锯片高度砍的树木高度之和long long max_JHight = 0;// 寻找最合适高度(锯片的)// 因为这个地方写为 left < right 我找错找了好久,要注意// 千万不要写成 left < right// 为什么left == right 的时候仍然要进入循环呢,因为此时的left 与 right还未曾参与计算// 需要进入循环将 middle 赋值为 (left + right) / 2while( left <= right ){tree_NewSum = 0;middle = (left + right) / 2;for( int i = 0; i < tree_num; i ++ ){// 如果电锯高度保持在 树木的高度内,锯下来就是>0,累加;电锯高度大于树木高度,则是砍空气,不计数(算出来是负数)// 即:如果可砍,则就累加if( middle < trees[ i ] )tree_NewSum += trees[ i ] - middle;}// 不断寻找 当前锯片高度砍的树木高度之和 == 需要的木材总长度 的数值// 招不到就找 当前锯片高度砍的树木高度之和 > 需要的木材总长度 且 最接近的 数值if( tree_NewSum >= tree_sum ){// 当前锯下来的总和 >= 需要的木材总和max_JHight = middle;left = middle + 1;} else{// 当前锯下来的总和 < 需要的木材总和// 至于为什么在这不 max_JHight = middle 操作,是因为锯下来的总和不满足需要的木材right = middle - 1;}}return max_JHight; // 返回锯片最高高度
}
int main( void ){long long tree_num, tree_sum; //  树木数量 需要的木材总长度cin >> tree_num >> tree_sum; //  输入 木数量 需要的木材总长度long long trees[ tree_num ]; //  每个树木的高度long long max_TreeHight; //  树木最高高度for( int i = 0; i < tree_num; i ++ ){cin >> trees[ i ];}sort( trees, trees + tree_num ); // 让数据变为升序,以便使用 二分搜索法max_TreeHight = trees[tree_num - 1];cout << binary_searchSelf(trees, tree_num, tree_sum, max_TreeHight) << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/21062.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jredis和SpringDataRedis学习笔记

jredis基础操作 jredis连接池 其中有个静态方法getJedis能够将练级池中的连接拿取出来并返回 通过setMaxWaitMitllis设置一个响应时间&#xff0c;如果连接池里面没有连接&#xff0c;那么请求连接方在等待超过响应时间时就会报错 springDataRedis 通过这样一个代码将redisTe…

【HarmonyOS Next】鸿蒙监听手机按键

【HarmonyOS Next】鸿蒙监听手机按键 一、前言 应用开发中我们会遇到监听用户实体按键&#xff0c;或者扩展按键的需求。亦或者是在某些场景下&#xff0c;禁止用户按下某些按键的业务需求。 这两种需求&#xff0c;鸿蒙都提供了对应的监听事件进行处理。 onKeyEvent 默认的…

vite调试node_modules下面插件

在使用vite进行开发的时候,我们可能想要修改node_modules中插件的源码.特别是集成一个SDK&#xff0c;需要调试去判断问题时&#xff0c;或者研究第三方源码时后; vite默认是走缓存的&#xff0c;所以当修改后不会看到你打印的日志&#xff0c;这个时候有几种方法可以选择; 方式…

大数据开发治理平台~DataWorks(核心功能汇总)

目录 数据集成 功能概述 使用限制 功能相关补充说明 数据开发 功能概述 数据建模 功能概述 核心技术与架构 数据分析 功能概述 数据治理 数据地图 功能概述 数据质量 功能概述 数据治理资产 功能概述 使用限制 数据服务 功能概述 数据集成 DataWorks的数据…

JAVA生产环境(IDEA)排查死锁

使用 IntelliJ IDEA 排查死锁 IntelliJ IDEA 提供了强大的工具来帮助开发者排查死锁问题。以下是具体的排查步骤&#xff1a; 1. 编写并运行代码 首先&#xff0c;我们编写一个可能导致死锁的示例代码&#xff1a; public class DeadlockExample {private static final Obj…

【DeepSeek】Mac m1电脑部署DeepSeek

一、电脑配置 个人电脑配置 二、安装ollama 简介&#xff1a;Ollama 是一个强大的开源框架&#xff0c;是一个为本地运行大型语言模型而设计的工具&#xff0c;它帮助用户快速在本地运行大模型&#xff0c;通过简单的安装指令&#xff0c;可以让用户执行一条命令就在本地运…

挑战一星期复现一个项目——安全帽项目

本项目为识别安全帽项目&#xff0c;基于yoloV5模型&#xff0c;接下来&#xff0c;我将一步一步展示我的完整复现过程以及遇到的问题和解决方案。 前言 我们在利用GPU进行深度学习的时候&#xff0c;都要去NVIDIA的官网下载CUDA的安装程序和cudnn的压缩包&#xff0c;然后再…

基于java新闻管理系统,推荐一款开源cms内容管理系统ruoyi-fast-cms

一、项目概述 1.1 项目背景 在信息高速流通的当下&#xff0c;新闻媒体行业每天都要处理和传播海量信息。传统的新闻管理模式依赖人工操作&#xff0c;在新闻采集、编辑、发布以及后续管理等环节中&#xff0c;不仅效率低下&#xff0c;而且容易出现人为失误。同时&#xff0…

.NET SixLabors.ImageSharp v1.0 图像实用程序控制台示例

使用 C# 控制台应用程序示例在 Windows、Linux 和 MacOS 机器上处理图像&#xff0c;包括创建散点图和直方图&#xff0c;以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包&#xff08;版本 1.0.4&#xff09;添加到.NET Core 3.1/ …

图论(四):图的中心性——度中心性介数中心性紧密中心性

图的中心性&#xff1a;描述节点在图中有多“中心” 度中心性 以节点的度数度量中心性 用nx.degree_centrality(G)计算 介数中心性 量化节点在图中承担“桥梁”程度。计算 节点v 出现在其他任意两个节点对 (s,t) 之间的最短路径的次数&#xff08;下式V 是无向图节点集合。(…

在项目中调用本地Deepseek(接入本地Deepseek)

前言 之前发表的文章已经讲了如何本地部署Deepseek模型&#xff0c;并且如何给Deepseek模型投喂数据、搭建本地知识库&#xff0c;但大部分人不知道怎么应用&#xff0c;让自己的项目接入AI模型。 文末有彩蛋哦&#xff01;&#xff01;&#xff01; 要接入本地部署的deepsee…

DeepSeek服务器繁忙 多种方式继续优雅的使用它

前言 你的DeepSeek最近是不是总是提示”服务器繁忙,请稍后再试。”&#xff0c;尝试过了多次重新生成后&#xff0c;还是如此。之前DeepSeek官网连续发布2条公告称&#xff0c;DeepSeek线上服务受到大规模恶意攻击。该平台的对话框疑似遭遇了“分布式拒绝服务攻击”&#xff0…

利用亚马逊AI代码助手生成、构建和编译一个游戏应用(下)

在上篇文章中中&#xff0c;我们介绍了如何通过亚马逊AI代码生成助手 - Amazon Q Developer代理的代码生成、构建和测试功能&#xff0c;让开发者可以更高效地交付高质量代码项目&#xff0c;同时减少代码中bug错误&#xff0c;提升整体开发体验。在本篇中&#xff0c;我们将通…

网络安全技术pat实验 网络安全 实验

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 网络安全实验3 前言Kali 常用指令工具教程 ettercap 基本使用 一、口令破解 John the ripper 破解 linux 密码l0phtcrack7 破解 windows 密码John 破解 zip 压…

网络行为管理系统是什么?有什么功能?

​简单来说&#xff0c;网络行为管理系统就是对网络进行有效的规范约束和调整&#xff0c;关于网络行为管理系统的相关问题整理了一些详细介绍供大家参考。 一、什么是网络行为管理系统&#xff1f; 在数据网络和数据通信业务发展非常迅速&#xff0c;在数据网络和通信业务迅…

毕业设计—基于Spring Boot的社区居民健康管理平台的设计与实现

&#x1f393; 毕业设计大揭秘&#xff01;想要源码和文章&#xff1f;快来私信我吧&#xff01; Hey小伙伴们~ &#x1f44b; 毕业季又来啦&#xff01;是不是都在为毕业设计忙得团团转呢&#xff1f;&#x1f914; 别担心&#xff0c;我这里有个小小的福利要分享给你们哦&…

垃圾回收器

一、GC分类与性能指标 1.垃圾回收器概述: 垃圾收集器没有在规范中进行过多的规定&#xff0c;可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中&#xff0c;因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器&#xff0c;可以将…

Java基础——代理模式

代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问&#xff0c;这样就可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。 一、代理模式的主要作用 控制访问&#xff1a;通…

微软宣布 Windows 11 将不再免费升级:升级需趁早

大家都知道如果你现在是Windows 10 系统&#xff0c;其实可以免费升级到正版 Windows 11&#xff0c;只要你的电脑配置满足 TPM2.0要求。 而最近微软已经公布了 Windows 10 的最后支持时间&#xff0c;也就是今年10月14日&#xff0c;在这之后微软将不再对Windows 10负责&#…

django连接mysql数据库

1.下载mysqlclient第三方库 2.在settings.py里连接数据库&#xff08;提前建好&#xff09; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: 学生信息,USER: root,PASSWORD: 999123457,HOST: localhost,POST: 3306,} } 3.在models.py里创建一个类&#xff0…