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;
}

运行结果:

posted @ 2020-09-18 11:15  littlemelon  阅读(1129)  评论(0编辑  收藏  举报