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;
}
'APS > 백준' 카테고리의 다른 글
[17245] 서버실 C++ (0) | 2022.02.21 |
---|---|
[2110] 공유기 설치 C++ (0) | 2022.02.13 |
[2512] 예산 C++ (0) | 2022.02.09 |
[1920] 수 찾기 C++ (0) | 2022.02.08 |
[3273] 두 수의 합 (0) | 2021.08.25 |