1. 程式人生 > 其它 >天池 線上程式設計 木材加工(二分查詢)

天池 線上程式設計 木材加工(二分查詢)

技術標籤:LintCode及其他OJ

文章目錄

1. 題目

有一些原木,現在想把這些木頭切割成一些長度相同的小段木頭,需要得到的小段的數目至少為 k
當然,我們希望得到的小段越長越好,你需要計算能夠得到的小段木頭的最大長度

木頭長度的單位是釐米。原木的長度都是正整數,我們要求切割得到的小段木頭的長度也要求是整數。
無法切出要求至少 k 段的,則返回 0 即可。

示例
樣例 1
輸入:
L = [232, 124, 456]
k = 7
輸出: 114
Explanation: 我們可以把它分成114cm的7段,而115cm不可以

樣例 2
輸入:
L =
[1, 2, 3] k = 7 輸出: 0 說明:很顯然我們不能按照題目要求完成。

https://tianchi.aliyun.com/oj/231203672248052266/245580596369363585

2. 解題

  • 二分查詢模板題
class Solution {
public:
    /**
     * @param L: Given n pieces of wood with length L[i]
     * @param k: An integer
     * @return: The maximum length of the small pieces
     */
    int
woodCut(vector<int> &L, int k) { // write your code here int l = 1, r = INT_MAX, mid, maxlen = 0; while(l <= r) { mid = l+((r-l)/2); if(ok(L, mid, k))// 每段 mid 長度,能切出來 k 根嗎 { maxlen = mid; l = mid+1; } else
r = mid-1; } return maxlen; } bool ok(vector<int> &L, int len, int k) { int count = 0; for(int i = 0; i < L.size(); i++) { count += L[i]/len; } return count >= k; } };

我的CSDN部落格地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
Michael阿明