60分蒟蒻求挑
查看原帖
60分蒟蒻求挑
945630
jjj0523楼主2023/3/19 23:13
#include<bits/stdc++.h>
using namespace std;
long long  n,m;
long long h[1000005];
long long height;

long long judge(long long x)
{
	long long sum=0;
	for(int i=1;i<=n;i++)
	{
		if(h[i]>x)
		{
			sum+=h[i]-x;
		}
	}
	return sum;
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>h[i];
	}
	sort(h+1,h+1+n);
	long long  minh=0;
	long long  maxh=h[n];
	//二分板子
	while(minh<maxh)
	{
		long long midh=(minh+maxh)/2;
		if(judge(midh)==m)
		{
			//从第二个数据可知不一定要等于m
			cout<<midh;
			return 0;
		}
		else if(judge(midh)<m)
		{
			//中间值要小于所需木材的长度需要降低剧的高度
			maxh=midh-1;
			
		}
		else if(judge(midh)>m)
		{
			//中间值要大于木材长度说明剧多了要提高剧的标准
			minh=midh+1;
			
		}
	}
	//当循环跳出时此时即有minh>maxh,此时的maxh就是结果
	//要输出最大的最小
	cout<<maxh;
	return 0;
}
2023/3/19 23:13
加载中...