k개의 랜선으로 n개의 랜선을 만들 때, 최대 길이를 구하는 문제.
1부터 주어진 최대 길이의 랜선 사이의 길이를 고르면 된다.
1과 최대 길이값의 중간 길이부터 시작한다.
랜선을 잘랐을 때,
위 과정을 반복하면서 최소값과 최대값을 계속 늘이고 줄이다보면, 최소값이 최대값보다 커지는 경우가 발생한다.
그 때, length에 저장된 값이 가능한 가장 긴 길이이다.
#include <iostream>
#include <algorithm>
using namespace std;
unsigned int n, k, length;
unsigned int len[10000];
int main() {
cin >> k >> n;
unsigned int left = 1;
unsigned int right = 0;
unsigned int mid;
for (int i = 0; i < k; i++) {
cin >> len[i];
right = max(right, len[i]);
}
while (left <= right) {
mid = (left + right) / 2;
int cnt = 0;
for (int i = 0; i < k; i++) {
cnt += len[i] / mid;
}
if (cnt < n) {
right = mid - 1;
}
else {
left = mid + 1;
length = max(length, mid);
}
}
cout << length;
}
주어진 길이들만을 이용하여 푸려면 어렵지만, 최대값을 추출해서 1과 비교하면 쉽게 풀 수 있다.