APS/백준

[2805] 나무 자르기 C++

문래동까마귀 2022. 2. 13. 01:31

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

 

2805번: 나무 자르기

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

www.acmicpc.net

 

-> sum이나 tmp는 int범위를 초과할 수 있어 long long으로 변환 후 통과

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

using namespace std;

int main() {
	int N, M;
	int arr[1000001];
	cin >> N >> M;

	long long sum = 0;
	for (int i = 0; i < N; i++) {
		cin >> arr[i];
		sum += arr[i];
	}

	sort(arr, arr + N);

	if (sum == M) {
		cout << "0";
		return 0;
	}

		int left = 0;
		int right = arr[N - 1];

		int answer;
		while (left <= right) {
			long long tmp = 0;
			int middle = (left + right) / 2;

			for (int i = 0; i < N; i++) {
				tmp += min(arr[i], middle);
			}

			if (sum - tmp >= M) {
				answer = middle;
				left = middle + 1;
			}

			else {
				right = middle - 1;
			}

	}

		cout << answer;
	
	return 0;
}