二分查找:在 0 和 L 之间,枚举距离,假设mm = (0 + L) >>1,然后每次用最长为mm的距离去跳,最后看跳完的次数是否满足条件,若不满足,则表明,<=mm的距离都不行,则再查找mm+1到L之间的距离……
#include "stdio.h"
int l, n, m;
int stn[500005];
void qsort(int st, int ed){
int s = st; int e = ed;
int t = stn[st];
if(st>=ed) return;
while(s<e){
while(s<e && stn[e]>=t) e--;
stn[s] = stn[e];
while(s<e && stn[s]<=t) s++;
stn[e] = stn[s];
}
stn[s] = t;
qsort(st, s-1);
qsort(s+1, ed);
}
int find(int len){
int i, j, s = 0;
j = 0;
while(j<n+1){
i = j+1;
while(i<=n+1 && stn[i]-stn[j]<=len) i++;
s++; i--;
if(i==j) return 0; /*i==j时,表明连续的两个石头的距离大于len,跳不过去*/
j = i; /*更新j为下一跳的起始*/
}
if(s<=m) /*判断最后跳的步数,是否小于m*/
return 1;
else
return 0;
}
int main(){
int i, mid, lf, rt, ans;
freopen("in.txt", "r", stdin);
while(scanf("%d %d %d", &l, &n, &m)!=EOF){
for(i=1; i<=n; i++)
scanf("%d", stn+i);
stn[0] = 0; stn[n+1] = l;
qsort(1, n);
lf = 0; rt = l;
while(lf<=rt){
mid = lf + ((rt-lf)>>1);
if(find(mid)){
rt = mid-1;
ans = mid;
}else
lf = mid+1;
}
printf("%d\n", ans);
}
return 0;
}