首页 > 其他分享 >跳石头(NOIP2015)

跳石头(NOIP2015)

时间:2022-12-20 22:56:08浏览次数:70  
标签:二分 NOIP2015 int mid 石头 cnt now check

AcWing
洛谷

解题思路

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

模板选用

\(我们是为了二分出满足check函数的最大值,所以是这个样子(o表示满足check,\)
\(.是不满足,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;
}

标签:二分,NOIP2015,int,mid,石头,cnt,now,check
From: https://www.cnblogs.com/StkOvflow/p/16995291.html

相关文章

  • 剪刀石头布小游戏
    这是源码import java.util.Scanner;//1public class sdd{    public static void main(String[] args) {        // TODO Auto-generated method......
  • 『牛角书』鸿蒙小游戏之石头剪刀布
    一、游戏逻辑通过页面下方按钮与游戏中的人物pk,赢了加一分,输了减一分,平局不加分也不减分。二、游戏效果如图所示,选择石头后游戏中人物出布,因此我的得分为-1。三、主要代码3.......
  • 计蒜客 剪刀石头布
    题目:初始代码#include<stdio.h>intmain(){intN,NA[200],NB[200];intna,nb;intsuma=0,sumb=0;scanf("%d%d%d",&N,&na,&nb);for(inti=0;......
  • P2661 [NOIP2015 提高组] 信息传递
    P2661[NOIP2015提高组]信息传递题目简述第i个人可以将自己的信息传给第\(t_i\)个人,当有人从别人那里得到自己信息时就结束,问最少要进行多少轮思路这题感觉真的很巧......
  • 石头-剪刀-布
    描述石头-剪刀-布是两个人玩的游戏。假设有两个人A和B,每个人都独立地选择石头,布或剪刀。选布的赢选石头的,选剪刀的赢选布的,选石头的赢选剪刀的,选相同的既不赢又不输。n个......
  • P2671 [NOIP2015 普及组] 求和
    [NOIP2015普及组]求和题目背景NOIP2015普及组T3题目描述一条狭长的纸带被均匀划分出了\(n\)个格子,格子编号从\(1\)到\(n\)。每个格子上都染了一种颜色\(color_i\)......
  • NOIP2015Day1T2-信息传递
    2.信息传递(message.cpp/c/pas)【问题描述】有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递......
  • NOIP2015Day2T1-跳石头
    1.跳石头(stone.cpp/c/pas)【问题描述】一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石......
  • NOIP2015Day2T2-子串
    2.子串(substring.cpp/c/pas)【问题描述】有两个仅包含小写英文字母的字符串A和B。现在要从字符串A中取出k个互不重叠的非空子串,然后把这k个子串按照其在字符串A中出现......
  • NOIP2015Day1T1-神奇的幻方
    1.神奇的幻方(magic.cpp/c/pas)【问题描述】幻方是一种很神奇的N∗N矩阵:它由数字1,2,3,……,N∗N构成,且每行、每列及两条对角线上的数字之和都相同。当N为奇数时......