典型的二分答案,
一般出现最大中的最小,或最小中的最大,且有序,则优先考虑二分,
呆码注释如下:
#include<bits/stdc++.h>
using namespace std;
int l, n, k;
int a[100010];
int b[100010];
bool check(int x) {//要找的数
int cnt = 0;
for (int i = 0; i < n - 1; i++) {
int num = b[i];
while (num > x) { //如果大于 要找的数
cnt++;
num -= x; //在这个数 的距离放个路标
}
}
return cnt <= k; //与 要放的路标比较.如果cnt小 则x太大
}
int main() {
cin >> l >> n >> k;
int j = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
if (i > 0) {
b[j++] = a[i] - a[i - 1];//用b记录两个路标的差值
}
}
//二分查找
int l = 0;
int r = 1000000;
//个人喜欢这样写
while (l + 1 < r) {
int mid = (l + r) >> 1;//位运算等同与 (l + r) / 2
if (check(mid)) {
r = mid;
} else {
l = mid;
}
}
cout << r;
return 0;
}