F 個子不高不怕打雷的女生

2021-10-02 02:21:09 字數 2274 閱讀 2573

f.個子不高不怕打雷的女生

== 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

sample output 1
sample input 2

10     6

20   11   5   9   24   23   2   20   3   19

sample output 2
思路 其實本題就是用二分法來做,但是並不是根據二分的定義生搬硬套的,從**裡面上下界定義來開就非如此,他是劃定乙個大範圍,用二分法查詢最適合的值,而不一定是他給你的一組數裡面的某乙個,畢竟巧克力棒可以掰開,看哪乙個值能夠滿足條件(能夠分給k個物件,即大於等於k),然後再找其中最大值。

再看一下學長給的思路:

題意

就是把 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

}