北京·时间:
北京·时间:

题解:洛谷 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 @   jess1ca1o0g3  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示