지난번 랜선자르기와 비슷한 문제입니다.
백준_1654_랜선자르기
랜선의 개수와 필요한 랜선의 개수가 주어졌을 때 그 개수만큼 만들 수 있는 랜선의 최대 길이를 구하는 문제입니다. 초기 코드)#include void lan_cal(int lan_length[], int max, int lan_count, int lan_need);int
sol248.tistory.com
이 문제와 같이 이분 탐색으로 문제를 풀어보겠습니다.
위 문제와 동일한 방식으로 풀었습니다.
전체 코드)
#include <stdio.h>
int binary_search(int tree_need, int max, int min, int tree[], int size);
int main(void)
{
int n; // 나무의 수 (1~1,000,000)
int m; // 집으로 가져가려고 하는 나무의 길이 (1~2,000,000,000)
scanf("%d %d", &n, &m);
int tree[n];
int max = 0, min = 0, size = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &tree[i]);
size++;
if (tree[i] > max)
max = tree[i];
}
printf("%d\n", binary_search(m, max, min, tree, size));
return 0;
}
int binary_search(int tree_need, int max, int min, int tree[], int size)
{
int mid = (max + min) / 2;
while (min != mid)
{
long long tmp = 0;
long long tr = 0;
for (int i = 0; i < size; i++)
{
tmp = tree[i] - mid;
if (tmp < 0)
tmp = 0;
tr += tmp;
}
if (tr < tree_need)
{
max = mid;
}
else if (tr >= tree_need)
{
min = mid;
}
mid = (max + min) / 2;
}
return mid;
}
'백준 > c' 카테고리의 다른 글
백준_11866_요세푸스문제0 (0) | 2024.05.15 |
---|---|
백준_1654_랜선자르기 (0) | 2024.05.14 |
백준_1929_소수구하기 (0) | 2024.05.12 |
백준_10816_숫자카드2 (0) | 2024.05.08 |
백준_2839_설탕배달 (0) | 2024.05.08 |