四、距离的智慧

题目描述

学校新建造了一个有 N(2≤N≤10^5) 个小隔间的自习室,这些隔间分布在一条直线上,坐标是x1x2x3…xn(0≤xi≤10^9)。为了保持尽可能的安静,减少周边环境的影响,睿智的大树老师想把自习学生安置在指定的隔间,所有自习学生中相邻两人的最近距离越大越好。有 C(2≤C≤N)名学生,那么,这个最大的最近距离是多少呢?

输入格式

第 1 行:两个用空格隔开的数字 N 和 C。

第 2∼ N+1 行:每行一个整数,表示每个隔间的坐标。

输出格式

输出只有一行,即相邻读者最大的最近距离。 输入输出样例

输入

5 3
1
2
8
4
9

输出

3

视频题解

https://dl.ccf.org.cn/video/videoDetail.html?_ack=1&id=7092424601733120

AC 代码

#include <iostream>
#include <algorithm>
using namespace std;
const int MaxN = 10005;
int arr[MaxN] ;
int main() {
	int n,c;
	cin >> n >> c;
	for(int i = 1; i <= n; i++){
		cin >> arr[i];
	}
	sort(arr+1,arr+1+n); // 排序
	//二分查询
	int low = 0 , high = arr[n] - arr[1];
	int ans = 0 ; //最大的最近间隔
	int cnt = 1;
	while(low <= high){
		int left = 1;
		int mid = (low + high) / 2;

		for(int i= 2; i<=n;i++){
			if(arr[i] - arr[left] >= mid){
				cnt ++;
				left = i;
			}
		}
		if(cnt >= c){
			ans = max(ans,mid);
			low = mid + 1; // 左指针右移
		}else{
			high = mid -1; // 右指针左移
		}
	}
	cout << ans;
	
	return 0;
}