感觉两种写法都没什么区别,但输出的答案不一样,实在没搞懂究竟是为什么,求助大佬。
代码上的区别只有:
第一种写法的二分写法是:
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;
}
感谢指教!