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

(https://ialy1595.github.io/post/parametric-search/ 의 내용을 참고하였습니다.)
Parametric Search는 최댓값/최솟값을 구하는 최적화 문제를,이 문제는 "최댓값을 구하는 문제"이고, 그 값을 직접 계산하기엔 복잡하다. 따라서 조건을 만족하는지 확인하는 결정 문제로 바꾼 후, 이분 탐색을 이용하는 Parametric Search 기법을 사용한다.
✔️
H 높이로 잘랐을 때, 나무 길이의 합이 M 이상인가?를 판단하는 결정 문제로 변형하고
✔️ 만족한다면더 높이 자를 수 있는지 탐색
✔️ 만족하지 못한다면톱 높이를 낮추는 방향으로 탐색
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N, M;
cin >> N >> M;
vector<int> trees(N);
for(int i = 0; i < N; i++){
cin >> trees[i];
}
int low = 0, high = 1000000000;
int ans;
while(low <= high){
int mid = (low + high) / 2;
ll sum = 0;
for(auto &tree: trees){
sum += max(0, tree - mid);
}
// 높이를 mid로 설정했을 때 요건을 만족 -> 정답 후보로 저장하고, 높이를 올리기
if(sum >= M) {
ans = mid;
low = mid + 1;
}
// 요건 만족 x -> 높이를 낮춰봄
else high = mid - 1;
}
cout << ans;
return 0;
}