题目链接:The Frog's Games
解题思路:首先跳的话最小距离就是相邻两点的最大距离,那么最大距离就是一次跳过去,也就是l,那么这里随着距离的增大,跳跃次数呈现为非递增序列。所以找到这个序列里面>=m的第一个值,就直接二分就好了。
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> p;
int L, n, mid;
int check(int d){
int ret = 0, i, j, k;
int next;
for(i = 0; i < p.size(); i++){
next = upper_bound(p.begin(), p.end(), p[i] + d) - p.begin() - 1;
//printf("%d-----------%d %d %d\n", d, i, next, p[next]);
if(next == i){
return ret;
}
ret++;
i = next - 1;
}
return ret;
}
int main(){
int i, j, k, d;
while(~scanf("%d%d%d", &L, &n, &mid)){
p.clear();
p.push_back(0);
p.push_back(L);
for(i = 0; i < n; i++){
scanf("%d", &k);
p.push_back(k);
}
sort(p.begin(), p.end());
d = 0;
for(i = 1; i < p.size(); i++){
d = max(d, p[i] - p[i - 1]);
}
int l, r, m;
l = d; r = L + 1;
while(l < r){
m = (l + r) >> 1;
int tem = check(m);
//printf("%d\n", tem);
if(tem > mid){
l = m + 1;
}
else{
r = m;
}
}
printf("%d\n", l);
}
return 0;
}