题目链接:
[TJOI2007]路标设置 - 洛谷https://www.luogu.com.cn/problem/P3853
思路:
二分答案 + 贪心,对于每个枚举答案,遇到距离超过答案的,在尽量远的地方放一个路标。
由于是计算最小的满足题意的结果,可以用 left < right 型偏左二分。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
ll far;
ll len[maxn];
ll n, k;
bool check(int mid){
int c = 0;
int num = 0;
for(int i=1; i<=n; i++){
while(len[i]-c > mid) {num++; c += mid;}
c = len[i];
}
return num <= k;
}
int main(){
cin >> far >> n >> k;
for(int i=1; i<=n; i++){
cin >> len[i];
}
int left = 1, right = far;
while(left < right){
int mid = left + (right-left)/2;
if(!check(mid)) left = mid+1;
else right = mid;
}
cout << left << '\n';
}