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; }
时间: 2024-10-07 05:25:29