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

例:对于三根长度分别为 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;
} 

猜你喜欢

转载自blog.csdn.net/qq_36666756/article/details/83036332