ppt歡迎頁面模板網(wǎng)絡(luò)營銷中的seo與sem
木材加工
題目背景
要保護環(huán)境
題目描述
木材廠有 n n n 根原木,現(xiàn)在想把這些木頭切割成 k k k 段長度均為 l l l 的小段木頭(木頭有可能有剩余)。
當(dāng)然,我們希望得到的小段木頭越長越好,請求出 l l l 的最大值。
木頭長度的單位是 cm \text{cm} cm,原木的長度都是正整數(shù),我們要求切割得到的小段木頭的長度也是正整數(shù)。
例如有兩根原木長度分別為 11 11 11 和 21 21 21,要求切割成等長的 6 6 6 段,很明顯能切割出來的小段木頭長度最長為 5 5 5。
輸入格式
第一行是兩個正整數(shù) n , k n,k n,k,分別表示原木的數(shù)量,需要得到的小段的數(shù)量。
接下來 n n n 行,每行一個正整數(shù) L i L_i Li?,表示一根原木的長度。
輸出格式
僅一行,即 l l l 的最大值。
如果連 1cm \text{1cm} 1cm 長的小段都切不出來,輸出 0
。
樣例 #1
樣例輸入 #1
3 7
232
124
456
樣例輸出 #1
114
提示
數(shù)據(jù)規(guī)模與約定
對于 100 % 100\% 100% 的數(shù)據(jù),有 1 ≤ n ≤ 1 0 5 1\le n\le 10^5 1≤n≤105, 1 ≤ k ≤ 1 0 8 1\le k\le 10^8 1≤k≤108, 1 ≤ L i ≤ 1 0 8 ( i ∈ [ 1 , n ] ) 1\le L_i\le 10^8(i\in[1,n]) 1≤Li?≤108(i∈[1,n])。
思路
函數(shù)check()用來判斷當(dāng)前長度x是否滿足條件,即根據(jù)當(dāng)前長度可以切割出至少k個長度為x的木棍。在check()函數(shù)中,遍歷所有木棍,將每個木棍的長度除以x,然后求和,得到切割出的木棍數(shù)量。如果切割出的數(shù)量大于等于k,則返回true,否則返回false。
在主函數(shù)中,定義變量l和r,分別表示長度范圍的左右邊界。開始時,左邊界l為0,右邊界r為1e8 + 7。
使用二分查找的思想,當(dāng)左邊界l和右邊界r相差1時,即l + 1 < r時,進行循環(huán)。每次循環(huán)計算中點mid,然后調(diào)用check()函數(shù)判斷mid是否滿足條件。
如果mid滿足條件,則更新左邊界l為mid,因為要找的長度肯定要比mid更大才能滿足條件。
如果mid不滿足條件,則更新右邊界r為mid,因為要找的長度肯定要比mid更小才能滿足條件。
最后輸出左邊界l,即為滿足條件的最大長度。
AC代碼
#include <iostream>
#define ll long long
using namespace std;const int N = 1e6 + 7;int n, k;
int l[N];bool check(int x) {ll sum = 0;for (int i = 1; i <= n; i++) {sum += l[i] / x;}// cout << x << " " << sum << endl;return sum >= k;
}int main() {cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> l[i];}int l, r;l = 0;r = 1e8 + 7;while (l + 1 < r) {int mid = (l + r) / 2;if (check(mid)) {// 偏短l = mid;} else {// 偏長r = mid;}}cout << l << endl;return 0;
}