首页 > 其他分享 >P2678 跳石头

P2678 跳石头

时间:2023-11-25 21:44:45浏览次数:36  
标签:移走 P2678 岩石 mid 石头 int 终点 check

题目描述

这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。

为了提高比赛难度,组委会计划 移走 一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能移走起点和终点的岩石)。

正解是二分答案,它效率很高(nlogn)

解题思路

这道题可以用二分答案,写一个check(),用于计算出移走石头的数量(枚举,计数型),再写一个find(),跟二分查找差不多,只是修改L,R的条件换成了check(mid)


AC代码

#include<bits/stdc++.h>
using namespace std;
int a[50010];
int l,n,m;
bool check(int x)
{
    //移走石头太少/刚刚好(<=m)返回真
    int y=0;
    int stand=0; //站在哪个石头上
    for(int i=1;i<=n+1;i++)
    {
        if(a[i]-a[stand]<x)
            y++;
        else
            stand=i;
    }
    return y<=m;
}
int Find()
{
    int L=1,R=1e9;
    int ans=0;
    while(L<=R)
    {
        int mid=(L+R)>>1;//右移n <=> 除以2^n
        if(check(mid)) //如果有解,一定位于左半区间
            ans=mid,L=mid+1;
        else
            R=mid-1;
    }
    return ans;
}
int main()
{
    scanf("%d%d%d",&l,&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    //设置终点
    a[n+1]=l;
    printf("%d",Find());
    return 0;
}

-----------EOF--------------

标签:移走,P2678,岩石,mid,石头,int,终点,check
From: https://www.cnblogs.com/algorithm-hu/p/17856164.html

相关文章

  • P2678 跳石头 题解
    P2678跳石头链接这道题其实很水我们二分最长距离,最后用$check$函数判断合不合法一下是核心代码$check$函数这样写:boolcheck(intx){ intlast=0,tot=0; for(inti=1;i<=n;i++){ if(a[i]-last<x)tot++; elselast=a[i]; } if(len-last<x)tot++; returntot<......
  • 2022新生赛 玩石头 题解
    这题乍一看是个背包,但是它对背包物品的重量进行了限制,而且我们没有手段得知当前物品是否大于前面所有物品。研究发现,纪念品最大价值不会超过4000.因此我们可以用类似于01背包的做法,以纪念品价值作为重量,纪念品重量作为价值来dp.打表可以发现,在给定数据的范围下,石头塔最多为三十层,......
  • 【文档翻译】面向数据设计(以及为啥用OOP可能会搬起石头砸自己的脚)
    本文档译自gamesfromwithin.com的文章"Data-OrientedDesign(OrWhyYouMightBeShootingYourselfInTheFootWithOOP)",作者Noel,原文参见此处概述-Overview想象一下:在开发周期的末尾,你的游戏卡的像乌龟在爬,但是你却没有在profiler发现任何明显的性能热点。真正的......
  • 代码随想录算法训练营-动态规划-3-(0-1背包问题)|416. 分割等和子集、1049. 最后一块石
    416.分割等和子集01背包的递推公式为:dp[j]=max(dp[j],dp[j-weight[i]]+value[i]);如果dp[j]==j说明,集合中的子集总和正好可以凑成总和j,理解这一点很重要。1classSolution:2defcanPartition(self,nums:List[int])->bool:3_sum=......
  • 09_石头剪刀布
    1.数组root@bk:~#arr=(aabbcc)root@bk:~#echo${arr[@]}aabbccroot@bk:~#echo${arr[0]}aaroot@bk:~#echo${arr[2]}cc#遍历序号root@bk:~#foriin${!arr[@]};doecho$i;done012#通过序号遍历元素root@bk:~#foriin${!arr[@]};doecho${arr[$i......
  • 2850. 将石头分散到网格图的最少移动次数-362
    2850.将石头分散到网格图的最少移动次数给你一个大小为3*3,下标从0开始的二维整数矩阵grid,分别表示每一个格子里石头的数目。网格图中总共恰好有9个石头,一个格子里可能会有多个石头。每一次操作中,你可以将一个石头从它当前所在格子移动到一个至少有一条公共边的相邻......
  • LeetCode/将石头分散到网格的最少移动次数
    给你一个大小为3*3,下标从0开始的二维整数矩阵grid,分别表示每一个格子里石头的数目。网格图中总共恰好有9个石头,一个格子里可能会有多个石头。每一次操作中,你可以将一个石头从它当前所在格子移动到一个至少有一条公共边的相邻格子。请你返回每个格子恰好有一个石头的......
  • 题解 石头剪刀布
    plaesekillme.&&don'tforgetme.题目描述给定\(n\)个字符串\(s_i\)只包含0,1,2,现在要捏一个序列\(A\),\(s_i\)表示\(a_i\)可以捏成什么。1,2,3形成环形吊打关系,\(\omega(X)\)表示序列\(X\)最长的吊打子序列,吊打序列指的是对于\(a_{p_1},\dots,a_{p_k}\),除了......
  • Python写一个剪刀石头布小游戏
    #导入包importrandom#调用randint()函数,表示随机取其中的任意一个数,左闭右也毕#初始化变量n=0pc=0#表示电脑计分person=0#表示人计分whilen<3:a=random.randint(1,3)#a代表电脑b=int(input('请出拳(1.剪刀,2.石头,3.布):'))#改变变量n+=1#if判断,当电脑出剪刀时:......
  • LeetCode 1049.最后一块石头的重量II
    1.题目:1049. 最后一块石头的重量II有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x<=y。那么粉碎的可能结果如下:如果 x==y,那么两块石头都会被完全粉......