P1873 砍樹 二分

2021-10-24 08:51:08 字數 1065 閱讀 4150

題目描述

伐木工人公尺爾科需要砍倒m公尺長的木材。這是乙個對公尺爾科來說很容易的工作,因為他有乙個漂亮的新伐木機,可以像野火一樣砍倒森林。不過,公尺爾科只被允許砍倒單行樹木。

公尺爾科的伐木機工作過程如下:公尺爾科設定乙個高度引數h(公尺),伐木機公升起乙個巨大的鋸片到高度h,並鋸掉所有的樹比h高的部分(當然,樹木不高於h公尺的部分保持不變)。公尺爾科就行到樹木被鋸下的部分。

例如,如果一行樹的高度分別為20,15,10和17,公尺爾科把鋸片公升到15公尺的高度,切割後樹木剩下的高度將是15,15,10和15,而公尺爾科將從第1棵樹得到5公尺,從第4棵樹得到2公尺,共得到7公尺木材。

公尺爾科非常關注生態保護,所以他不會砍掉過多的木材。這正是他為什麼盡可能高地設定伐木機鋸片的原因。幫助公尺爾科找到伐木機鋸片的最大的整數高度h,使得他能得到木材至少為m公尺。換句話說,如果再公升高1公尺,則他將得不到m公尺木材。

輸入格式

第1行:2個整數n和m,n表示樹木的數量(1<=n<=1000000),m表示需要的木材總長度(1<=m<=2000000000)

第2行:n個整數表示每棵樹的高度,值均不超過1000000000。所有木材長度之和大於m,因此必有解。

輸出格式

第1行:1個整數,表示砍樹的最高高度。

輸入輸出樣例

輸入 #1

5 20

4 42 40 26 46

輸出 #1

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e6+10;

int a[maxn]

;ll n, k;

bool

judge

(int x)

return

false;}

intmain()

cout << ans << endl;

return0;

}

P1873 砍樹 二分裸題

題意 給出n顆樹,要砍這些樹,工具會揮向這些高度不一的平行的樹,掉落下來的高度的總和,就是砍掉的樹的長度總和 給出乙個至少砍到的長度值 題目中的樹的長度大於等於這個長度值 要求我們尋找乙個最優的高度,讓砍掉的數目長度盡量少,又能滿足題意 思路 這是二分經典題 我們定義乙個最大區間範圍之後,就開始ch...

二分答案 洛谷P1873 砍樹

思路總結 伐木工人公尺爾科需要砍倒m公尺長的木材。這是乙個對公尺爾科來說很容易的工作,因為他有乙個漂亮的新伐木機,可以像野火一樣砍倒森林。不過,公尺爾科只被允許砍倒單行樹木。公尺爾科的伐木機工作過程如下 公尺爾科設定乙個高度引數h 公尺 伐木機公升起乙個巨大的鋸片到高度h,並鋸掉所有的樹比h高的部分...

洛谷P1873 砍樹 題解 二分答案

首先,在已知砍伐高度 h 的情況下,我們可以直接求得能夠得到的木材總長度。所以,我們可以開乙個函式bool check int h 用於判斷在砍伐高度為 h 的情況下,得到的木材總長度是否 m 如果是,則返回 true 否則,返回 false。可以發現,隨著砍伐高度的上公升,得到的木材的數量肯定是減...