二分法求解切割木棍求最大切割长度

例:对于三根长度分别为 10,24 ,15的木棍来说假设K=7,即需要至少7段长度相等的木棍,那么可以得到最大长度为6,在这种情况下,第一根木根可以提供10/6=1段,第二根24/6=4段,第三根15/6=2段,达到了7段的要求。

分析:

     将最短的那个木根长度看成一个数轴上的值,如第一根木棍[0,10] ,应为只要最短的那根满足了切割的最大长度,那么其余的都满足最大长度了。所以可以对最短的那根木棍考虑使用二分法,不断地去逼近最大值。注意:使用int型变量达到取整的效果。

#include<cstdio>
int binaryFind(int x,int y ,int z,int K)
{   int sumK,mid;
	int left=0,right=x;
	while(left<right)//只要两者相等了说明找到那个位置了 
	{   mid=(left+right)/2;
		if(sumK<K)//当满足这个条件的时候说明分割的位置小了,需要将left=mid 
		{      //然后计算sumK的值,也就是每段分的段数加起来与K比较。 
			left=mid;
			sumK=x/mid+y/mid+z/mid; 
		}
		else
		 	{
		 		right=mid;
		 		sumK=x/mid+y/mid+z/mid;
		 	}
	}
	return mid;
	 
}


int main()
{   printf("切割的最大长度为:%d",binaryFind(10,24,15,7));
	return 0;
} 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值