高手求助!两种写法的区别在哪?为什么一种可以直接AC另一种才对一个点?
查看原帖
高手求助!两种写法的区别在哪?为什么一种可以直接AC另一种才对一个点?
322285
北京楼主2021/2/1 17:29

感觉两种写法都没什么区别,但输出的答案不一样,实在没搞懂究竟是为什么,求助大佬。
代码上的区别只有:
第一种写法的二分写法是:

while(l<r)
	{
		long long mid=(l+r)/2,lon=0;
		for(int i=1;i<=n;++i)
			if(a[i]>=mid)lon=lon+a[i]-mid;
		if(lon>m)l=mid+1;
		else r=mid;
	}

第二种写法的二分写法是:

while(l<r)
	{
		long long mid=(l+r+1)/2,lon=0;
		for(int i=1;i<=n;++i)
			if(a[i]>=mid)lon=lon+a[i]-mid;
		if(lon>=m)l=mid;
		else r=mid-1;
	}

以下是完整代码:

第一种写法:(只对一个点)

//P1873 砍树
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long a[N],maxn;
int main()
{
	int n;
	long long m;
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		cin>>a[i],maxn=max(a[i],maxn);
	long long l=1,r=maxn;
	while(l<r)
	{
		long long mid=(l+r)/2,lon=0;
		for(int i=1;i<=n;++i)
			if(a[i]>=mid)lon=lon+a[i]-mid;
		if(lon>m)l=mid+1;
		else r=mid;
	}
	cout<<l;
	return 0;
}


第二种写法:(AC)

//P1873 砍树
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long a[N],maxn;
int main()
{
	//freopen("input.txt","r",stdin);调试用的freopen
	int n;
	long long m;
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		cin>>a[i],maxn=max(a[i],maxn);
	long long l=1,r=maxn;
	while(l<r)
	{
		long long mid=(l+r+1)/2,lon=0;
		for(int i=1;i<=n;++i)
			if(a[i]>=mid)lon=lon+a[i]-mid;
		if(lon>=m)l=mid;
		else r=mid-1;
	}
	cout<<l;
	return 0;
}

感谢指教!

2021/2/1 17:29
加载中...