River Hopscotch
题目链接:Click Here~
题目分析:
给出N坐标,固定起点(0)终点在L处(题目给出)要求删除M个坐标,使得剩下的相邻的两个坐标之间的最小距离的值最大。求这个最大值。
思路分析:
不知道为什么就是想到了用二分枚举这个最小距离最大的值,以下我们假设为D。要如何去做呢?
1、首先,我们可以用二分得到这个D。
2、根据函数C:可以满足条件的最大距离
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 50000 + 10;
const int INF = ~0U >> 2;
int N,M,L;
int d[MAXN];
bool C(int D){ //判断距离D是否满足
int cnt = 0,pos = 0;
for(int i = 0;i <= N;++i){
if(d[i] - pos < D)
++cnt;
else
pos = d[i];
}
return cnt <= M;
}
void solve(){
sort(d,d + N);
d[N] = L;
int lb = -1,ub = INF;
while(ub - lb > 1){ //二分D
int mid = (lb + ub) / 2;
if(C(mid)) lb = mid;
else ub = mid;
}
printf("%d\n",lb);
}
int main()
{
while(~scanf("%d%d%d",&L,&N,&M)){
for(int i = 0;i < N;++i)
scanf("%d",&d[i]);
solve();
}
return 0;
}