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