#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
vector<int> house;
int n, m, maxDist, minDist, midDist, curr, result = 0;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
int temp;
cin >> temp;
house.push_back(temp);
}
sort(house.begin(), house.end());
minDist = 1; //제일 짧은 거리
maxDist = house[n - 1]; //가장 긴 거리
while (minDist <= maxDist)
{
midDist = (maxDist + minDist) / 2; //중간값 지정
curr = house[0]; //공유기 시작
int counts = 1; //0번은 공유기 깔고시작
for (int i = 1; i < n; i++)
{
if (house[i] - curr >= midDist) //공유기 깐 지점에서 다음 집까지의 거리가 중간거리보다 크거나같나
{
curr = house[i]; //현재 집에 공유기 설치
counts++; //공유기 개수 증가
}
}
if (counts >= m) //공유기 목표 개수보다 같거나 많을 때
{
result = midDist; //두 공유기사이 최대거리
minDist = midDist + 1; //거리가 평균에 가까워지도록 중간거리+1씩 올려준다.
}
else
{
maxDist = midDist - 1;
}
}
cout << result;
}
풀다가 꼬여서 헤매었지만 해결.
- 제일 짧은거리는 1로 제일 긴거리는 vector중 제일 큰 값으로 설정
- 제일 짧은거리를 house[1] - house[0] 제일 긴 거리를 house[n - 1] - house[0]로 했는데 틀림
'Algorithm > Baekjoon' 카테고리의 다른 글
[C++] 백준 1991 트리 순회 (0) | 2021.02.10 |
---|---|
[C++] 백준 1939 중량제한 (0) | 2021.02.09 |
[C++] 백준 1236 성 지키기 (0) | 2021.02.04 |
[C++] 백준 1668 트로피 진열 (0) | 2021.02.04 |
[C++] 백준 1302 베스트셀러 (0) | 2021.02.04 |