样例全过,只a了第一,这是为啥emmm?
查看原帖
样例全过,只a了第一,这是为啥emmm?
181805
天马行空mz楼主2022/7/8 11:03
//P1873 [COCI 2011/2012 #5] EKO / 砍树
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000100
#define ll long long
ll n,m;
ll h[maxn];
ll ans=0;
ll l=1,r,mid;
bool judge(ll x)//二分判断函数【x为锯片高度】 
{
	ll sum=0;
	for(ll i=lower_bound(h+1,h+n+1,x)-h;i<=n;i++)
	{
		sum+=h[i]-x;
	}
	if(sum>m) return true;//结果比预期大,看看还能不能节省
	else if (sum<m) return false;//至少木头不能砍少 
	else if(sum==m)//找到答案 
	{
		ans=mid;
		return true;
	}
} 
int main()
{
	cin>>n>>m;
	for(ll i=1;i<=n;i++)
	{
		scanf("%lld",&h[i]);
		r=max(r,h[i]);
	}
	sort(h+1,h+n+1);
	while(l<r)//二分查找【面向答案】 
	{
		mid=(l+r)/2;
		if(judge(mid)) l=mid+1;//节省就把锯子抬高一点 
		else r=mid-1;//少了就相反,降低一些 
		if(ans!=0)
		{
			break;
		}
	}
	cout<<ans<<endl;
	return 0;
}

第二个样例太大,跑不动,所以只能问问了qwq

2022/7/8 11:03
加载中...