专栏文章
P2678 [NOIP 2015 提高组] 跳石头
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minotae6
- 此快照首次捕获于
- 2025/12/02 05:54 3 个月前
- 此快照最后确认于
- 2025/12/02 05:54 3 个月前
题意:
共有n块石头,至多移走m块石头
问:最短跳跃距离的最大值
思路:
使用二分计算出mid,将mid当最短跳跃距离的最大值,判断需要挪走的石头的数量
若挪走的石头的数量大于m,则mid需要变小;
否则mid需要变大
而在check中,我们只需要判断区间,使区间中当达到极限时将全部移走,并记录数量
程序:
CPP#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn(1e6+10);
ll k,n,m;
ll a[maxn];
bool check(ll x){
ll sum(0),id(0);
for(ll i(1);i<=n;i++){
if(a[i]-a[id]<x){
sum++;
}else{
id=i;
}
}
if(k-a[id]<x){
sum++;
}
return m>=sum;
}
int main(){
cin>>k>>n>>m;
a[n+1]=k;
for(ll i(1);i<=n;i++){
cin>>a[i];
}
ll l(1),r(k);
while(l<=r){
ll mid((l+r)/2);
if(check(mid)){
l=mid+1;
}else{
r=mid-1;
}
}
cout<<r<<'\n';
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...