C++程序算法題----木材加工


題目

木材廠有一些原木,現在想把這些木頭切割成一些長度相同的小段木頭,需要得到的小段的數目是給定了。當然,我們希望得到的小段越長越好,你的任務是計算能夠得到的小段木頭的最大長度。

木頭長度的單位是厘米。原木的長度都是正整數,我們要求切割得到的小段木頭的長度也要求是正整數。

Input

第一行是兩個正整數N和K(1 ≤ N ≤ 10000, 1 ≤ K ≤ 10000),N是原木的數目,K是需要得到的小段的數目。

接下來的N行,每行有一個1到10000之間的正整數,表示一根原木的長度。

Output

輸出能夠切割得到的小段的最大長度。如果連1厘米長的小段都切不出來,輸出"0"。

Sample Input

3 7

232

124

456

Sample Output

114

思路:

剛開始用的暴力搜索,結果時間超時。最后朋友告訴我用二分法。具體思想二分法的思想讀者自己查找資料閱讀。

  • 1、左值為0,右值為數組最大值+x (x可以取任何值,一般取1-100即可)
  • 2、最后輸出最大切割長度為右值-1

代碼:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int N,K;
    cin>>N>>K;
    int wood[10000];
    for(int i=0;i<N;i++){
        cin>>wood[i];
    }
    int lef = 0;
    int max_cut = 0;
    // 升序
    sort(wood,wood+N);
    int rig = wood[N-1]+1;
    // 二分法
    while(lef<rig){
        int sum = 0;
        int mid = (rig+lef)/2;
        if(mid==0){
            break;
        }
        for(int i=0;i<N;i++){
            sum += wood[i]/mid;
        }
        if(sum>=K){
            lef = mid+1;
        }else{
            rig = mid;
        }
    }
    cout<<rig-1;
}

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM