while
(l<=r)
else
}
伐木工人公尺爾科需要砍倒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
36本題中,check的檢查內容即為 所得到的樹的高度總和 是否符合題目
#include
#include
using
namespace std;
int n,m;
int ans=0;
int l=
0,r=0;
int tree[
1000005]=
;//注意資料範圍
bool
check
(int x)
}return s>=m;
//將高度和與需求高度m比較
}int
main()
while
(l<=r)
//簡單的對半查詢
else
}
cout/完美輸出!
return0;
}
要保護環境
木材廠有一些原木,現在想把這些木頭切割成一些長度相同的小段木頭(木頭有可能有剩餘),需要得到的小段的數目是給定的。當然,我們希望得到的小段木頭越長越好,你的任務是計算能夠得到的小段木頭的最大長度。木頭長度的單位是cm。原木的長度都是正整數,我們要求切割得到的小段木頭的長度也是正整數。
例如有兩根原木長度分別為11和21,要求切割成到等長的6段,很明顯能切割出來的小段木頭長度最長為5.
第一行是兩個正整數n和k(1 ≤ n ≤ 100000,1 ≤ k ≤ 100000000),n是原木的數目,k是需要得到的小段的數目。
接下來的n行,每行有乙個1到100000000之間的正整數,表示一根原木的長度。
能夠切割得到的小段的最大長度。如果連1cm長的小段都切不出來,輸出」0」。
輸入#1
3 7232
124456
輸出#1
114此題中,check用來判斷 被切割的段數是否符合題目要求
#include
#include
using
namespace std;
int n,k;
//n是原木的數目,k是需要得到的小段的數目
int treelen[
100005]=
;int l=
0,r=0;
int ans=0;
bool
check
(int x)
else
if(x==0)
//無法切割(長度<1)
}return s>=k;
//返回條件!!!!
}int
main()
while
(l<=r)
//簡單的對半查詢
else
} cout/完美輸出
return0;
}
折半查詢思想及實戰程式設計
1.折半查詢要求是陣列是有序為前提 如果不是有序的不能使用 2.提及查詢存在兩種情況,要麼資料存不存在要麼存在下標是多少 下面講解折半查詢的思想 首先定義乙個有序陣列 int array 10 1 10一共有10個資料,將這10個數進行編號,從0開始編號,即0 9 令left 0,right 9,m...
C語言 資料結構查詢 順序查詢及折半查詢
資料結構查詢 順序查詢和折半查詢 順序查詢 思路 從表中最後乙個記錄開始,逐個進行記錄的關鍵字和 給定值的比較,若某個記錄的關鍵字和給定值比較相等,則 返回返回記錄所在的位置,或查詢完所有記錄後還沒有發現 符合的記錄,則查詢失敗。include include include include def...
折半查詢面試題及細節的處理
public class arraydemo6 system.out.println getindex 4 arr,107,0,arr.length 1 折半查詢面試題 給定乙個有序的陣列,如果忘該陣列中儲存乙個元素,並保證這個陣列還是有序的。返回所儲存位置的角標。看到 1.有序的陣列 2.涉及查詢...