算法笔记之木棒切割问题

<<算法笔记>>p134页

问题分析:

此题的核心在于在满足切割后木棒数目符合要求外,求木棒的长度最大取值,这里很容易错解成一个符合条件的长度,并不是最大长度。

那么思考一下,这里的木棒最大长度代表着什么意思呢?

可以理解成 MaxL+1 一定导致木棒数目至少K-1。
MaxL-1可能会导致木棒数目至少K+1,也可能数目不变为K。

因此这个求MaxL的问题,可以解释成为求 K-1木棒数目所需L,再让L-1,就得到了我们索要的最大长度MaxL。如果有疑问请往下面看,这是一个类型的解题方式。

代码:
 

#include <stdio.h>
int N; //N个木棒
//最长的木棒 
int Max(int arr[]){
	int max=0;
	for(int i=0;i<N;i++){
		if(arr[i]>max){
			max=arr[i];
		}
	}
	return max;
}
//计算切割后小木棒总数 
int f(int arr[],int L){
	int sum=0; //切成sum个小木棒 
	for(int i=0;i<N;i++){
		sum=sum+arr[i]/L;
	}
	return sum;
}
//二分法 
int solve(int K,int arr[]){
	int left=0,right=Max(arr),mid;
	while(left<right){
		mid=(left+right)/2;
		if(f(arr,mid)<K){ //小木棒个数K-1时
		    right=mid;
		}else{
			left=mid+1;
		}
	}
	return right-1; //返回长度 
}
int main(){	
	scanf("%d",&N);
	int arr[N]; 
	for(int i=0;i<N;i++){
		scanf("%d",&arr[i]);//N个木棒的原始长度 
	}
	int K; //K个长度相同的小木棒 
	scanf("%d",&K);
	printf("%d",solve(K,arr)); 
	return 0;
} 

代码总结:
emm某些部分写得比较外行,但是问题不大,核心问题是写清楚了的。
这里我最想说的是,这个问题被转换为了一类问题:第一个满足条件的元素问题

有两个简单的例题大家可以拿去参考:
二分法经典例题

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值