결론: 원하는 만큼의 나무를 가져가기 위해 나무를 베고 최대한 남길 수 있는 높이를 찾아라
입력 수가 크지만 시간 제한은 1초이므로 선형 탐색은 시간 초과가 날 수 있다.
-> 이진 탐색을 써보자!
📌 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 매우 크다!!(1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000)
long long
자료형을 써야한다!
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
long long n, m, max = 0;
int tree[1000001];
cin >> n >> m;
for(int i = 0; i < n; i++) cin >> tree[i];
sort(tree, tree + n);
long long low = 0;
long long high = tree[n - 1];
while(low <= high){ //cut 가능할 때 까지
long long sum = 0;
long long cut = (low + high) / 2;
for(int i = 0; i < n; i++) {
if(tree[i] - cut > 0) sum += tree[i] - cut; // cut 하고 남는 게 있다면 가져감
}
if(sum >= m){ // m미터보다 가져간 나무가 같거나 많으면
max = cut; // 현재 cut 지점을 최대 지점으로 저장
low = cut + 1; // cut 가능 구간을 더 올림
} else{
high = cut - 1; // m미터가 안 되면 cut 가능 구간을 내림
}
}
cout << max; // 최대 cut 지점 출력
return 0;
}