算法:二分答案
思路
1.二分什么? 最远跳跃距离
2.二分边界:l = 1, r = 1e8
3.判断依据:自行添加的检测点数 cnt
- if cnt <= m + 1 ,比给定的监测点数少,说明最远跳跃距离太大了,需要缩小 r = mid;
- if cnt > m + 1 ,比给定的检测点数多,说明最远跳跃距离太小了,需要增大 l = mid + 1;
4.注意点
当前需要跳跃的距离是最远跳跃距离的整数倍时检查点数需要减一
mid = 3 -->当最远跳跃距离为 3 时
10 19 -->需要跳跃的距离为 9
9 / 3 = 3 -->由于是整数倍,因此检测点个数比实际情况多一个
10 13 16 19 --> 实际添加的检测点只有两个
C++代码
cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int len,n,m;
int a[N];
bool check(int mid) { //当前的最远距离
int cnt = 0; //检查点数
for(int i = 1; i <= n; i++) {
int len = a[i] - a[i - 1]; //从当前点跳到下一个点的距离
if(len > mid) {
cnt += (len / mid - (len % mid == 0)); //当整数倍的时候 添加的检测点个数 - 1
}
}
if(cnt <= m + 1) return true;
else return false;
}
signed main() {
scanf("%lld%lld",&n,&m);
for(int i = 1; i <= n; i++) {
scanf("%lld",&a[i]);
}
//二分边界
int l = 1, r = 1e9;
//二分对象 :最远跳跃距离
while(l < r) {
int mid = l + r >> 1;
if(check(mid)) r = mid; //最大的最小
else l = mid + 1;
}
printf("%lld",l);
return 0;
}