题目描述
新冠疫情,导致了各个城市之间物资输送的障碍。假设有N个城市在一条直线上,为了物资能顺利抵达各个城市,可以在路线上建立最多个数为K个暂时停靠站,由于火车在两个站台(城市也算站台)之间的距离越近,需要的总花费越少,因此我们需要让火车相邻两个站台之间的最大距离最小,求出距离L, 2 ≤ N ≤ 100000 2 ≤N ≤100000 2≤N≤100000, 0 ≤ K ≤ 100000 0 ≤K ≤100000 0≤K≤100000,所有城市坐标小于等于 1 0 12 10^{12} 1012,且不存在负值。提醒: 城市坐标均为正整数,且停靠站只能建在整数坐标点上。
输入描述:
第一行输入城市个数N,可建立停靠站个数K,
第二行输入N个城市的坐标(不保证前一个城市坐标比后一个城市小)。
输出描述
输出L
示例
输入
2 2
4 106
输出
34
AC的C++代码
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int N = 100010;
int n, k;
ll a[N];
int solve(ll x) {
int res = 0;
for(int i = 1; i < n; ++i) {
res += (a[i]-a[i-1]-1)/x;
}
return res > k;
}
int main() {
cin >> n >> k;
for(int i = 0; i < n; ++i)
cin >> a[i];
sort(a, a+n);
ll l = 1, r = 1e12, mid;
while(l <= r) {
mid = (l+r)>>1;
if(solve(mid))
l = mid+1;
else r = mid-1;
}
cout<<l<<endl;
return 0;
}