跳石头
题目:
https://www.luogu.com.cn/problem/P2678
第一行包含三个整数 L,N,ML,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。保证 L \geq 1L≥1 且 N \geq M \geq 0N≥M≥0。
接下来 NN 行,每行一个整数,第 ii 行的整数 D_i( 0 < D_i < L)Di(0<Di<L), 表示第 ii 块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。
输出格式
一个整数,即最短跳跃距离的最大值。
二分距离,要把起点和终点算进去
#include<iostream> #include<string.h> using namespace std; const int maxn=5e4+7; int a[maxn],b[maxn]; int L,n,m; int ju(int x,int w) { memcpy(b,a,sizeof(a)); int i; b[0]=0; for(i=1;i<=n&&w>=0;i++) { if(b[i]-b[i-1]<x) { b[i]=b[i-1]; w--; } } if(L-b[n]<x) { return 0; } // cout<<"x="<<x<<endl; //cout<<"i="<<i<<" "<<"w="<<w<<endl; if(i>n&&w>=0) return 1; else return 0; } int main() { cin>>L>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; int l=1,r=L; while(l<r) { int mid=(l+r+1)/2; if(ju(mid,m)) l=mid; else r=mid-1; } cout<<l<<endl; }
浙公网安备 33010602011771号