题解:洛谷 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;
}
本文来自博客园,作者:jess1ca1o0g3,转载请注明原文链接:https://www.cnblogs.com/Jessie-Pu/p/18290629
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】