专栏文章

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中,我们只需要判断区间,使区间[l,r][l,r]aralmida_r-a_l\le mid当达到极限时将l+1r1l+1\sim r-1全部移走,并记录数量

程序:

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 条评论,欢迎与作者交流。

正在加载评论...