木棒切割问题

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

结果

 

以上是关于木棒切割问题的主要内容,如果未能解决你的问题,请参考以下文章

51Nod - 1117 聪明的木匠

51Nod 1117 聪明的木匠

片段被视图分页器布局切割

51nod 1117 聪明的木匠:哈夫曼树

Shell脚本切割日志

小木棒HDU1455(DFS+剪枝)