← Back to List

2805번: 나무 자르기 ↗

Solutions

C++14
536 B | 536 chars
#include <iostream>
using namespace std;
long long N,M,ar[1100000],S;
long long a=0,b=1000000000,mid;
int main()
{
	cin>>N>>M;
	for(int x=0; x<N; x++) cin>>ar[x];
	while(a<b)
	{
		S=0;
		mid=(a+b)/2;
		for(int x=0; x<N; x++)
		{
			if(ar[x]>mid) S+=ar[x]-mid;
		}
		
		if(S<M)
		{
			b=mid-1;
		}
		else if(S>M)
		{
			a=mid+1;
		}
		else if(S==M)
		{
			cout<<mid;
			return 0;
		}
	}
	S=0;
	while(1)
	{
		S=0;
		for(int x=0; x<N; x++)
		{
			if(ar[x]>a) S+=ar[x]-a;
		}
		if(S>=M)
		{
			cout<<a;
			return 0;
		}
		else a--;
	}
	
	
}