社区讨论

100分求优化(必关)

P1873[COCI 2011/2012 #5] EKO / 砍树参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mjm8vl2o
此快照首次捕获于
2025/12/26 10:20
2 个月前
此快照最后确认于
2025/12/27 21:05
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[1000002];
int check(int mid,int n,int a[])
{ 
	int m = 0;
  	for(int i = 1;i<=n;i++)
	{
		if(a[i] > mid)
		{
			m += a[i]-mid;
		}
	}
	return m;
}
signed main()
{
	int n,h,l,r,p,q;
	int mid = 0;
	l = 0;
	r = 0;
	cin>>n>>h;
	for(int i = 1;i<=n;i++)
	{
	    scanf("%d",&a[i]);
		r = r + a[i];
	}
	sort(a,a+n+1);
	while(l<r)
	{
		mid = (l+r+1)/2;
		p=check(mid,n,a);
		q=check(mid+1,n,a);
		if(p>h && q<h)
		{
			cout<<mid;
			break;
		}
		else if(p>h&&q>h)
		{
			l=mid;
		}
        else if(q == h)
        {
            cout<<mid+1;
            break;
        }
		else if(p<h)
		{
			r=mid;
		}
		else if(p==h)
		{
			cout<<mid;
			break;
		}
		
	}
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...