주어진 K개의 랜선을 적당한 크기로 나눠 N개 이상의 새로운 랜선들을 만들어내야한다.
Left = 1 , Right = K개 랜선중 최대 길이
Half = (Left + Right) / 2 라 치면Half로 나눈 값들의 총 합이 N 이상이다
-> 정답 갱신 후 다음 Half값이 더 커지도록 Left = Half + 1로 갱신Half로 나눈 값들의 총 합이 N 미만이다
-> 다음 Half값이 더 작아지도록 Right = Half - 1로 갱신반복 후 구해진 최댓값 출력
여기서 주의할 점은 주어진 랜선 길이의 최댓값이 2^32 - 1이라 했으니 산술 오버플로우가 발생하지 않도록 길이와 관련된 변수를 unsinged int나 long long등의 해당 숫자까지 표현할 수 있는 자료형으로 선언해줘야 한다는 것이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
cin.tie(nullptr);
cout.tie(nullptr);
ios::sync_with_stdio(false);
int N, K;
cin >> K >> N;
vector<unsigned int> vecLine(K);
for (int i = 0; i < K; ++i)
{
cin >> vecLine[i];
}
sort(vecLine.begin(), vecLine.end());
unsigned int Left = 1;
unsigned int Right = vecLine[K - 1];
unsigned int Answer = 0;
while (Left <= Right)
{
int Cnt = 0;
unsigned int Half = (Left + Right) / 2;
for (int i = 0; i < K; ++i)
{
Cnt += vecLine[i] / Half;
}
if (Cnt >= N)
{
Answer = max(Answer, Half);
Left = Half + 1;
}
else
{
Right = Half - 1;
}
}
cout << Answer;
}