跳石头(二分+贪心)
输入格式
输出格式 一个整数,即最短跳跃距离的最大值。
输入
25 5 2 2 11 14 17 21
输出
4
说明/提示 样例数据说明:将与起点距离为 2和 14的两个岩石移走后,最短的跳跃距离为 4(从与起点距离 17 的岩石跳到距离 21 的岩石,或者从距离 21的岩石跳到终点)。 另外:全部数据满足如下
分析
1.此题按照暴力解的意思,就是依次采取距离(1~L),从所有石头中找出到源点之间有多少个石头可以删除,且删除数量不超过要求的数量M,找到移除石头数量恰好满足题意,且不超过不少于题述的那个临界距离就是答案。 2.用二分主要是可以优化时间复杂度,更快找到那个距离,从而不超时,二分的策略见注释。
代码(可左右滑动)
#include<bits/stdc++.h>
using namespace std;
int N,M,L;
int ans;
int a[100010];
int check(int x){
int t = 0;
int rm = 0;
for(int i = 0 ; i < N ; ++i){
if(a[i] - t < x){
rm++;
}else{
t = a[i];
}
}
return (rm<=M);
}
int main(){
cin>>L>>N>>M;
int mid,l = 0 , r= L;
for(int i = 0; i < N ; ++i){
cin>>a[i];
}
while(l<=r){
mid = (l+r)/2;
if(check(mid)){
l = mid + 1;
ans = mid;
}else{
r = mid - 1;
}
}
cout<<ans;
return 0;
}
|