오늘의 알고리즘

[C++] 백준 2110 공유기 설치

하늘하늘 . 2022. 6. 15. 16:33
#include <iostream>
#include <algorithm>
#include <vector>
 
int main()
{
    int N = 0;
    int C = 0;
    std::cin >> N >> C;
 
    std::vector<long long> vec(N, 0);
 
    for (int i = 0; i < N; ++i)
    {
        std::cin >> vec[i];
    }
 
    std::sort(vec.begin(), vec.end());
 
	int iLeft = 0;
	int iRight = vec[N - 1];
	int iAns = -1;
 
	while (iLeft <= iRight) 
	{
		int iCount = 1;
		int iPre = 0;
		int iMid = (iLeft + iRight) * 0.5;
 
		for (int i = 1; i < N; ++i) 
		{
			if (vec[i] - vec[iPre] >= iMid) 
			{
				iPre = i;
				++iCount;
			}
		}
 
		if (iCount >= C)
			iLeft = iMid + 1;
		else 
			iRight = iMid - 1;
 
		if (iAns < iMid && iCount >= C)
			iAns = iMid;
	}
 
	std::cout << iAns;
 
    return 0;
}
 

이분 탐색

1. 거리 탐색하기 위해서 무조건 sort

2. 기준을 중간으로 잡아놓고 C값만큼 돌릴 수 있는지 확인