路标设置。
解析
我们把公路上相邻路标的最大距离定义为该公路的“空旷指数”。
求增设路标后能达到的最小“空旷指数”值。
这两句明确的暗示了这题能使用二分答案。
再想一想,“空旷指数”越大越容易做到,满足单调性,可以用二分。
对于每次的 ( ext{mid}),由于路标不可移动,那么我们只要考虑两个路标之间的距离,如果超出了 ( ext{mid}) 就要考虑增加路标了。
增加路标时就是从一个路标开始,距离每有一个 ( ext{mid}),就加一个路标,直到下一个路标。
此外注意几个小细节:
1.如果两路标之间的的距离正好是 ( ext{mid}) 的倍数,要减去正好和最后一个路标重合的路标 。
2.二分板子不要写错了,注意小细节。
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int a[MAXN],L,n,k;
int check(int mid) {
int m=0;
for(int i=2; i<=n; i++) {
if(a[i]-a[i-1]>=mid) {
m+=(a[i]-a[i-1])/mid;
if((a[i]-a[i-1])%mid==0) {
m--;
}
}
}
if(m>k) {
return 0;
}
return 1;
}
int main() {
scanf("%d %d %d",&L,&n,&k);
for(int i=1; i<=n; i++) {
scanf("%d",a+i);
}
sort(a+1,a+n+1);
int l=0,r=L;
while(l<r) {
int mid=(l+r)/2;
if(check(mid)==1) {
r=mid;
} else {
l=mid+1;
}
}
printf("%d",l);
return 0;
}