木棒切割问题
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了木棒切割问题相关的知识,希望对你有一定的参考价值。
Input : 输入木棒根数n,要得到的等长木棒数量K,以及n根木棒的长度。
Output : 等长木棒的最大长度。
用二分法求解这道题,首先要找到以得到的等长木棒数量为因变量、等长木棒长度为自变量函数。
int getK(int l){//随着l增大,返回值会减小
int k = 0;
for(int i=0;i<n;i++){
k += L[i]/l;
}
return k;
}
其次,最后要找的l是最后一个满足k>=K的长度,不妨转化为第一个满足k<K的l,然后减一。
可以写出二分函数
int BS(int l,int r,int K){
int mid;
while(l<r){
mid = (l+r)/2;
if(getK(mid)<K){
r = mid;//减小l
}else{
l = mid+1;//增大l
}
}
return l;
}
完整代码
#include<cstdio>
#include<iostream>
#include<set>
using namespace std;
const int maxn = 10010;
int n,K;//有n根木棒,至少要求得到K根等长的
int L[maxn];
int getK(int l){//随着l增大,返回值会减小
int k = 0;
for(int i=0;i<n;i++){
k += L[i]/l;
}
return k;
}
int BS(int l,int r,int K){
int mid;
while(l<r){
mid = (l+r)/2;
if(getK(mid)<K){
r = mid;//减小l
}else{
l = mid+1;//增大l
}
}
return l;
}
int main(){
cin>>n>>K;
for(int i=0;i<n;i++){
cin>>L[i];
}
int l = BS(0,100,K);
cout<<"木棒的最大长度为:"<<l-1<<endl;
return 0;
}
结果
以上是关于木棒切割问题的主要内容,如果未能解决你的问题,请参考以下文章