f.個子不高不怕打雷的女生sample output 1sample input 2== description == 眾所周知,鋒哥喜歡的是個子不高不怕打雷的女生,但可惜的是,鋒哥到現在都沒有女朋友。
作為鋒哥的前隊友我當然要在這個題目中給他多找幾個物件!
現在鋒哥有k個物件(k可能大於農大的學生數量),聖誕節快要到了,鋒哥現在手上有n個巧克力棒,但是這些巧克力棒的長度是不一樣的,第i個巧克力棒的長度為a[i],鋒哥想給他的物件們相同的待遇,也就是說每個人的都是一樣長的。
巧克力棒是可以分割開的,但是給物件的不能是兩個拼接起來的,也就是說,你可以用乙個長度為10的分割成兩個5給兩個物件,但是你不能拿著乙個2和乙個3給乙個物件
現在鋒哥想請你幫他求出巧克力棒的長度,以便他給他的物件們。
input 第一行輸入:兩個整數n,k (1<=k,n<=1e6)
下面一行輸入:n個整數,a[i]表示每個巧克力棒的長度1<=a[i]<=1e9
output 乙個整數,表示最長的可以分配給物件們的巧克力棒長度
sample input 1
5 3
5 3 3 3 3
10 6sample output 2思路 其實本題就是用二分法來做,但是並不是根據二分的定義生搬硬套的,從**裡面上下界定義來開就非如此,他是劃定乙個大範圍,用二分法查詢最適合的值,而不一定是他給你的一組數裡面的某乙個,畢竟巧克力棒可以掰開,看哪乙個值能夠滿足條件(能夠分給k個物件,即大於等於k),然後再找其中最大值。20 11 5 9 24 23 2 20 3 19
再看一下學長給的思路:
題意
「就是把 n 個長條,截成 k 個長度相等的長條,然後問你最長的長度是多少」
題解思路:
「二分列舉答案」
「為什麼要用二分列舉答案?」
「首先是單調性!(體現的不是很好,但是可以自己想一下**有單調性?)」
「從我給出的資料來看,我們的可能的答案的最大值不可能超過 1e18 那麼利用二分列舉 的以二為底的 log 來說,最多查詢 64 輪就可以了」
「二分的界限是非常確定的,下限可以是最小值也可以是 0,上限很明顯是最大值(因為 不能拼接巧克力棒)。」
「題解中上界是和,其實不是最優的,最大值是最優秀的」
「我們每一輪在幹什麼?」
「查詢的每一輪次我們都在用我們列舉出來的答案去做判斷」
「判斷一下是不是用我當前的長度就能分給 k 個人。」
「如果我當前列舉的答案是正確的 那麼我就可以去嘗試去列舉更大的答案,如果不行,那麼 我就只能是列舉更小的答案以達到我的題意中的條件。」
「注意資料範圍,需要使用 long long。」
【源**】
#include
using
namespace std;
ll long
long
int n,k;
int a[
1000010];
//函式判斷棒可以給幾個人
intjudge
(ll mid)
return sum;
}int
main()
//在最低和最高界限之間使用二分法
while
(l<=r)
else r = mid-1;
} cout << ans
}