Programming/Algorithm

[Algorithm] C++ 마구간 정하기(이분검색)

100winone 2019. 12. 23. 17:29

입력설명

첫 줄에 자연수 N(3<=N<=200,000)과 C(2<=C<=N)이 공백을 사이에 두고 주어집니다. 둘째 줄부터 N개의 줄에 걸쳐 마구간의 좌표 xi(0<=xi<=1,000,000,000)가 한 줄에 하나씩 주어집니다.


출력설명

첫 줄에 가장 가까운 두 말의 최대 거리를 출력하세요.

 

입력예제

5 3 

1 2 8 4 9

 

출력예제

3

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>

using namespace std;
int n;
int Count(int len, int x[]) {
	int i, cnt = 1, pos = x[1];
	for (i = 2; i <= n; i++) {
		if (x[i] - pos >= len) {
			cnt++;
			pos = x[i];
		}
	}
	return cnt;
}
int main() {
	int m, i, lt = 1, rt, mid, res;
	scanf("%d %d", &n, &m);
	int* x = new int[n + 1]; // 동적 배열로 선언 , 200000을 선언하기엔 너무 크기 때문!
	for (i = 1; i <= n; i++) {
		scanf("%d", &x[i]);
	}
	sort(x + 1, x + n + 1);
	rt = x[n];
	while (lt <= rt) {
		mid = (lt + rt) / 2;
		if (Count(mid, x) >= m) {
			res = mid;
			lt = mid + 1;
		}
		else rt = mid - 1;
	}
	printf("%d\n", res);
	return 0;
}