카테고리 없음
[C] 백준 - 2805번: 나무 자르기
C0MPAS
2024. 4. 17. 13:30
4월 17일(수) - 이분 탐색 (2805번)
2805번: 나무 자르기
첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보
www.acmicpc.net
최초 생각 정리
문제점
1. int 범위 -> long long 범위
풀이
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
long long N, M;
long long tree[1000001];
long long total, mid, result, max = 0;
void binary_search(long long tree[], long long left, long long right)
{
if (left > right)
{
return;
}
total = 0;
mid = (left + right) / 2;
for (int i = 0; i < N; i++)
{
if (tree[i] > mid)
{
total = total + (tree[i] - mid);
}
}
if (total < M)
{
binary_search(tree, left, mid - 1);
}
else
{
result = mid;
binary_search(tree, mid + 1, right);
}
}
int main(void)
{
scanf("%lld %lld", &N, &M);
for (int i = 0; i < N; i++)
{
scanf("%lld", &tree[i]);
if (max < tree[i])
{
max = tree[i];
}
}
binary_search(tree, 0, max);
printf("%lld", result);
return 0;
}