Loading

题解:洛谷 P2678 [NOIP2015 提高组] 跳石头

  • 标签:二分,贪心

题意

给定一个数列,\(a_0=0,a_{N+1}=L\),从其中删除不超过 \(M\) 个数,使得 \(a_i-a_{i-1}\) 的最小值最大。

思路

最小值最大不难想到二分答案。

统计 \(a_i-a_j<mid\) 的数量 \(k\),如果不满足的话说明不删,\(j\gets i\)

最后 \(k\leq m\) 则枚举右区间。

注意 \(a_0=0,a_{N+1}=L\),以及二分边界。

代码

#include<bits/stdc++.h>
#define i64 long long
#define L(a,b,c) for(int i=a;i<=b;i+=c)
#define R(a,b,c) for(int i=a;i>=b;i-=c)

using namespace std;

const int N=5e4+5,M=998244353;

int s,n,m,a[N];

void solve();

signed main(){
  ios::sync_with_stdio(0);
  
  solve();
  
  return 0;
}

bool check(int g){
  int k=0,i=0,j=0;
  while(i<n+1){
    i++;
    if(a[i]-a[j]<g) k++;
    else j=i;
  }
  return k<=m;
}

void solve(){
  cin>>s>>n>>m;
  L(1,n,1) cin>>a[i];
  a[n+1]=s;
  int l=1,r=1e9,mid;
  while(l<=r){
    mid=(l+r)/2;
    if(check(mid)) l=mid+1;
    else r=mid-1;
  }
  cout<<l-1<<endl;
}
posted @ 2024-07-08 19:58  jess1ca1o0g3  阅读(34)  评论(0)    收藏  举报