题解:洛谷 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;
}
标签:二分,NOIP2015,洛谷,int,题解,P2678
From: https://www.cnblogs.com/Jessie-Pu/p/18290629