二分模板用错导致的问题,一个10分一个ac
查看原帖
二分模板用错导致的问题,一个10分一个ac
419117
wangxiang123楼主2021/3/3 15:51

这个题有个巨大的坑,搞了一天才发现,累死我了。来看下面这组数据。

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。

2021/3/3 15:51
加载中...