【二分搜索 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.pswp.cn/news/895961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895961.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895961.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek系列模型發展:從LLM到V3、R1的技術突破與優化各階段的重要論文匯總(附下載地址)

DeepSeek 系列模型從最初的 LLM 版本發展到最新的 V3 和 R1 版本&#xff0c;在架構設計、訓練效率和推理能力方面不斷取得進步。以下是各版本按時間倒序的詳細信息&#xff1a; 1. DeepSeek-R1 發布時間&#xff1a;2025年1月 論文標題&#xff1a;DeepSeek-R1: Incentivizi…

HTTP SSE 實現

參考&#xff1a; SSE協議 SSE技術詳解&#xff1a;使用 HTTP 做服務端數據推送應用的技術 一句概擴 SSE可理解為&#xff1a;服務端和客戶端建立連接之后雙方均保持連接&#xff0c;但僅支持服務端向客戶端推送數據。推送完畢之后關閉連接&#xff0c;無狀態行。 下面是基于…

推薦一款AI大模型托管平臺-OpenWebUI

推薦一款AI大模型托管平臺-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官網地址&#xff1a;https://openwebui.com/ GitHub地址&#xff1a; https://github.com/open-webui/open-webui Open WebUI 是一個可擴展、功能豐富且用戶友好的自托管 AI 平臺&#xff0c;旨在完全離…

js中常用方法整理

數據類型 typeOf()Number&#xff08;&#xff09;parseInt()parseFloat()- * / %檢測數據類型轉換為數字轉換為整數類型轉換為浮點類型非加法的數字運算toString()Boolean()String()轉換為字符串&#xff0c;不能轉換undefined/null字符串拼接轉換為布爾類型轉換為字符串、所有…

java練習(33)

ps:題目來自力扣 最強回文子串 給你一個字符串 s&#xff0c;找到 s 中最長的 回文 子串。 class Solution {public String longestPalindrome(String s) {if (s null || s.length() < 1) {return "";}int start 0, end 0;for (int i 0; i < s.length();…

本地部署DeepSeek大模型

環境&#xff1a;nuc工控機器 x86架構 ubuntu20.04 1、瀏覽器打開Download Ollama on Linux&#xff0c;復制命令。 2.打開終端&#xff0c;輸入命令。 curl -fsSL https://ollama.com/install.sh | sh 等待安裝&#xff0c;安裝完成后&#xff0c;終端輸入 ollama&#xff…

Nginx 常用命令和部署詳解及案例示范

一、Nginx常用命令 1.1 啟動 Nginx 要啟動 Nginx 服務&#xff0c;可以使用以下命令&#xff1a; sudo systemctl start nginx1.2 停止 Nginx 如果需要停止 Nginx 服務&#xff0c;可以使用以下命令&#xff1a; sudo systemctl stop nginx1.3 重啟 Nginx 在修改了 Nginx…

2025鴻蒙開發面試題匯總——通俗易懂

問題和通俗易懂的答案&#xff0c;覆蓋鴻蒙開發的核心知識點和實際場景&#xff0c;方便面試時快速評估候選人能力&#xff1a; 一、基礎概念&#xff08;必問&#xff09; 鴻蒙和安卓最大的區別是什么&#xff1f;舉個實際例子。 答案&#xff1a;鴻蒙是“分布式操作系統”&am…

Kotlin 優雅的接口實現

1. 日常遇到的冗余的接口方法實現 日常開發中&#xff0c;經常會要實現接口&#xff0c;但是很多場景中&#xff0c;只需要用到其中一兩個方法&#xff0c;例如 ActivityLifecycleCallbacks&#xff0c;它有很多個接口需要實現&#xff0c;但是很多時候我們只需要用到其中的一…

Java List 自定義對象排序 Java 8 及以上版本使用 Stream API

從 Java 8 開始&#xff0c;你可以使用 Stream API 對 List 進行排序&#xff0c;這種方式更加簡潔和靈活。 以下是一個示例代碼&#xff1a; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors;// 自定…

【Spring詳解一】Spring整體架構和環境搭建

一、Spring整體架構和環境搭建 1.1 Spring的整體架構 Spring框架是一個分層架構&#xff0c;包含一系列功能要素&#xff0c;被分為大約20個模塊 Spring核心容器&#xff1a;包含Core、Bean、Context、Expression Language模塊 Core &#xff1a;其他組件的基本核心&#xff…

Linux內核讀寫鎖與讀寫信號量的區別及選用

在Linux內核中&#xff0c;讀寫鎖&#xff08;rwlock_t&#xff09;和讀寫信號量&#xff08;struct rw_semaphore&#xff09;是兩種不同的同步機制&#xff0c;適用于不同的場景。以下是它們的區別和選用建議&#xff1a; 核心區別 特性讀寫鎖 (rwlock_t)讀寫信號量 (struct…

用openresty和lua實現壁紙投票功能

背景 之前做了一個隨機壁紙接口&#xff0c;但是不知道大家喜歡對壁紙的喜好&#xff0c;所以干脆在實現一個投票功能&#xff0c;讓用戶給自己喜歡的壁紙進行投票。 原理說明 1.當訪問http://demo.com/vote/時&#xff0c;會從/home/jobs/webs/imgs及子目錄下獲取圖片列表&…

LLaMA 3.1 模型在DAMODEL平臺的部署與實戰:打造智能聊天機器人

文章目錄 前言 一、LLaMA 3.1 的特點 二、LLaMA3.1的優勢 三、LLaMA3.1部署流程 &#xff08;一&#xff09;創建實例 &#xff08;二&#xff09;通過JupyterLab登錄實例 &#xff08;3&#xff09;部署LLaMA3.1 &#xff08;4&#xff09;使用教程 總結 前言 LLama3…

【Python爬蟲(25)】解鎖Python爬蟲:數據存儲的最優選擇與高效策略

【Python爬蟲】專欄簡介&#xff1a;本專欄是 Python 爬蟲領域的集大成之作&#xff0c;共 100 章節。從 Python 基礎語法、爬蟲入門知識講起&#xff0c;深入探討反爬蟲、多線程、分布式等進階技術。以大量實例為支撐&#xff0c;覆蓋網頁、圖片、音頻等各類數據爬取&#xff…

【復現DeepSeek-R1之Open R1實戰】系列8:混合精度訓練、DeepSpeed、vLLM和LightEval介紹

這里寫目錄標題 1 混合精度訓練1.1 FP16和FP321.2 優點1.3 存在的問題1.4 解決辦法 2 DeepSpeed3 vLLM3.1 存在的問題3.2 解決方法3.2.1 PagedAttention3.2.2 KV Cache Manager3.2.3 其他解碼場景 3.3 結論 4 LightEval4.1 主要功能4.2 使用方法4.3 應用場景 本文繼續深入了解O…

使用 FFmpeg 剪輯視頻指南

FFmpeg 是一個功能強大的多媒體處理工具&#xff0c;可以進行視頻和音頻的剪輯、合并、轉碼等操作。本文將詳細介紹如何使用 FFmpeg 進行視頻剪輯&#xff0c;并通過實例幫助你快速掌握剪輯技巧。我們會從最基礎的剪切功能講起&#xff0c;再延伸到一些高級操作&#xff0c;如指…

【分布式理論15】分布式調度1:分布式資源調度的由來與過程

文章目錄 一、操作系統的資源調度&#xff1a;從單核到多核二、 分布式系統的資源調度&#xff1a;從單臺服務器到集群三、 固定資源映射四、 動態資源分配&#xff1a;靈活的任務-資源匹配五、 資源調度過程&#xff1a;從申請到執行 本文主要討論主題&#xff1a; 從操作系統…

【Linux C/C++開發】Linux系統輕量級的隊列緩存mqueue

前言 開發設計時&#xff0c;通常會對業務流程進行模塊化&#xff0c;有些流程之間&#xff0c;不要求同步&#xff0c;但又需要傳遞信息時&#xff0c;如果存儲到數據庫&#xff0c;效率降低很多&#xff0c;如果是存放在內存是最好的。此時可以選擇系統的IPC&#xff08;進程…

Vue 實現通過URL瀏覽器本地下載 PDF 和 圖片

1、代碼實現如下&#xff1a; 根據自己場景判斷 PDF 和 圖片&#xff0c;下載功能可按下面代碼邏輯執行 const downloadFile async (item: any) > {try {let blobUrl: any;// PDF本地下載if (item.format pdf) {const response await fetch(item.url); // URL傳遞進入i…