题 目链接:https://www.luogu.com.cn/problem/P1824
题目描述
Farmer John 建造了一个有 �N(2≤�≤1052≤N≤105) 个隔间的牛棚,这些隔间分布在一条直线上,坐标是 �1,�2,⋯ ,��x1,x2,⋯,xN(0≤��≤1090≤xi≤109)。
他的 �C(2≤�≤�2≤C≤N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John 想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
输入格式
第 11 行:两个用空格隔开的数字 N 和 C。
第 2∼N+1 行:每行一个整数,表示每个隔间的坐标。
输出格式
输出只有一行,即相邻两头牛最大的最近距离。
题解:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n, c, b;
bool check(int ans) // 判断取大了还是小了
{
int num = 0; // 所需的牛栏数
int l = a[1]; // l记录上一只牛的位置,开始时第一只牛一定在第一个牛栏
for(int i = 2; i <= n; i ++ ){ // 依次枚举每个牛栏
if(a[i] - l < ans) num ++; // 若此距离不满足当前答案,那么需要的牛栏数+1,即把当前牛放到下一个牛栏
else l = a[i]; // 否则就更新上一次的牛栏位置 ,即上一头牛放的位置
if(num > b) return false;
}
return true;
}
int main()
{
cin >> n >> c;
for(int i = 1; i <= n; i ++ )
cin >> a[i];
b = n - c; // 最大剩的牛栏数
sort(a+1, a+n+1);
int l = 0, r = a[n] - a[1] + 1;
while(l+1 < r )
{
int mid = l+r >> 1;
if(check(mid)) l = mid; // 若此答案可行,从mid ~ r区间继续查找(更大答案),即修改左界l=mid
else r = mid; // 若此答案不可行,从l ~ mid区间查找(合理答案),即修改左界l=mid
}
if(check(r)) cout << r <<endl;
else cout << l <<endl;
return 0;
}