这个题有个巨大的坑,搞了一天才发现,累死我了。来看下面这组数据。
10
80
1 54 89 65 45 63 12 22 77 10
正确结果为53,然而mid=53时砍的树并不是80而是83,有多余的三米浪费了,因为我们不能保证一定有刚好的情况。这个题的准确意义是说在能得到所需木材的最小高度,所以如果你只把找到相等为跳出循环的条件是不行的。
错误代码的二分:
while(l<=r)
{
mid=l+(r-l)/2;
if(f(mid)==m)
{
cout<<mid;
return 0;
}
else if(m<f(mid))l=mid+1;
else r=mid-1;
}
return 0;
正确的二分:
while(l<=r)
{
mid=l+(r-l)/2;
if(m<=f(mid))l=mid+1;
else r=mid-1;
}
cout<<l-1;
return 0;
用刚才那组数据,第一个代码找不到刚好相等的,无输出。第二个代码进行到l=53,r=54时,f(53)大于所需,l=53+1=54,然后跳出循环,输出54-1=53。