[C++] 백준 2805 : 나무 자르기
#include <iostream>
#include <vector>
using namespace std;
long long N, M;
vector<long long> v;
int main(int argc, char **argv){
scanf("%lld %lld",&N,&M);
long long x, maxN = 0;
for(int i=0; i<N; i++){
scanf("%lld",&x);
v.push_back(x);
if(maxN < x){
maxN = x;
}
}
long long left = 1, right = maxN, mid; // 이진탐색
long long result = 0;
while(left <= right){
mid = (left + right) / 2;
long long tmp = 0;
for(int i=0; i<v.size(); i++){
if(v[i] >= mid){
tmp += v[i] - mid;
}
}
if(tmp >= M){
left = mid + 1;
result = mid;
} else {
right = mid - 1;
}
}
printf("%lld", result);
return 0;
}
이진 탐색이라고 생각해낼 수 있어서 뿌듯했다. 코드는 아직 익숙치못해서 블로그에 예전에 푼 이진 탐색 코드를 확인하고 풀었다. 조금 더 풀어보면 바로 생각나는 날이 오겠지...
그리고 범위 확인하고 int 말고 long long을 써야하는지 확인하자.
Author And Source
이 문제에 관하여([C++] 백준 2805 : 나무 자르기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lamknh/C-백준-2805-나무-자르기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)