알고리즘/boj

BOJ 2805 나무 자르기

칼퇴시켜주세요 2023. 2. 3. 16:28
728x90

이 문제는 얼마전 포스팅했던 BOJ 1654 랜선 자르기 문제와 100%일치하는 문제이다. 

핵심은 적절한 나무 길이를 구하기 위해 이진 탐색을 이용해야하는 것이다. 

https://devconf.tistory.com/65

 

BOJ 1654 랜선 자르기

이 문제는 K개의 랜선이 주어지고 이를 이용하여 N 개(이상)의 랜선을 만든는데 랜선의 길이를 가장 길게 만들때 그 랜선의 길이를 구하는 문제이다. 시작 아이디어는 주어진 K개의 랜선으로 N개(

devconf.tistory.com

#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;

typedef long long ll;

int n, m;
vector<ll> len;
ll result;

bool cmp(ll a, ll b)
{
	return a > b;
}

void BS(ll l, ll r)
{
	if(l > r)
	{
		return;
	}

	ll mid = ceil((double)(l + r) / 2);
	ll total = 0;
	for(int i = 0; i < n; i++)
	{
		if(mid <= len[i])
		{
			total += (len[i] - mid);
		}
	}

	if(total < m)
	{
		BS(l, mid - 1);
	}
	else
	{
		result = max(result, mid);
		BS(mid + 1, r);
	}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> n >> m;

	for(int i = 0; i < n; i++)
	{
		ll num;
		cin >> num;
		len.push_back(num);
	}

	sort(len.begin(), len.end(), cmp);

	BS(0, len[0]);

	cout << result;
}
반응형

'알고리즘 > boj' 카테고리의 다른 글

BOJ 7662 이중 우선순위 큐  (0) 2023.02.05
BOJ 18870 좌표 압축  (0) 2023.02.05
BOJ 1826 연료 채우기  (0) 2023.02.03
BOJ 1654 랜선 자르기  (0) 2023.02.01
BOJ 10816 숫자 카드 2  (0) 2023.02.01