二分答案 洛谷P1873 砍樹

2021-10-07 12:59:19 字數 1437 閱讀 9432

思路總結

**伐木工人公尺爾科需要砍倒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,因此必有解。

5 20

4 42 40 26 46

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

36

1.題意很好理解,考慮到鋸片的高度越低,越可能滿足條件 但是要求讓鋸片的高度盡可能高

可以抽象成乙個陣列[1~maxl]

這個陣列前半部分是true 代表滿足條件 即 木材長度之和大於等於m

後半部分是false 即 小於m 我們只需要找到最後乙個true的位置就好啦~

2.過程可以由二分答案實現,每次二分時的判斷只需要暴力遍歷一遍所有樹 計算出在當前高度下能得到的木材之和就好啦~

資料挺大的 建議開long long

難點在於看出二分答案可以求正解 o(nlogn)

#include

#include

#include

#include

#include

#include

#include

#define maxn 400010

#define inf 0x7ffffff

#define ll long long

using

namespace std;

ll n,m;

ll a[

1000010];

ll maxl;

intmain()

ll l=

0,r=maxl,ans=-1

;while

(l<=r)

else r=mid-1;

} cout

("pause");

return0;

}

洛谷P1873 砍樹 題解 二分答案

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

P1873 砍樹 二分

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

洛谷1873砍樹 二分答案

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