StkOvflow

STACK OVERFLOW!

一言(ヒトコト)

你无聊吗,快去刷题。
——lmh

跳石头(NOIP2015)

AcWing
洛谷

解题思路

这题看到最短跳跃距离尽可能长就会想到二分
但是我们二分的check函数怎么写呢
可以看到限制条件移走的石头最多只能是m
我们二分这个最短距离
容易想到一个贪心策略:扫描一遍a数组,如果aianow<mid,(now是当前站的石头,一开始在岸上,所以是now=0),那因为此时mid是移走后的两块石头间的最短距离,不存在有两块石头的距离D<mid ,所以第i块必须移走, cnt++(cnt是移走的总数),最后判断一下是否(cnt<=m)即可

模板选用

checkocheck
.v

oooooooooooooov..............

选用二分模板如下

int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return r;
}

代码

#include <iostream>

using namespace std;

const int N = 5e5 + 10;
int a[N], n, m, L;

bool check(int x) 
{
    int cnt = 0, now = 0;
    for (int i = 1; i <= n; i ++ ) 
        if (a[i] - a[now] < x) cnt ++ ;
        else now = i;
    return cnt <= m;
}

int main()
{
    scanf("%d%d%d", &L, &n, &m);
    
    for (int i = 1; i <= n; i ++ ) 
        scanf("%d", &a[i]);
    a[ ++ n] = L;
    
    int l = 0, r = L;
    while (l < r) 
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    printf("%d\n", r);
    
    return 0;
}
posted @   StkOvflow  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示