본문 바로가기
전공공부/코딩테스트

(c++) 백준 "2805) 나무 자르기"

by 시아나 2022. 6. 4.

https://www.acmicpc.net/problem/2805

 

2805번: 나무 자르기

첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보

www.acmicpc.net


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
	long long N, K; cin >> N >> K;
	vector<long long> list;
	for (long long i = 0; i < N; i++) {
		long long n; cin >> n;
		list.push_back(n);
	}
	long long left = 0, right = *max_element(list.begin(), list.end());
	long long answer = right;
	while (left <= right) {
		long long mid = (left + right) / 2;
		long long sum = 0;
		for (long long i = 0; i < N; i++) {
			long long num = list[i] - mid;
			if (num > 0) {
				sum += num;
			}
		}
		if (sum >= K) {
			left = mid + 1;
			answer = mid;
		}
		else {
			right = mid - 1;
		}
	}
	cout << answer << endl;
	return 0;
}