当前位置: 首页 > article >正文

算法日记2:洛谷p3853路标设置(二分答案)

一、题目:

在这里插入图片描述

二、解题思路:

2.1:首先,我们二分空旷指数

  • 1、因为题目中要求我们求解最大值最小应该是属于第二类模型
  • 2.也就是说,当check()函数为true时候,说明这个空旷指数是成立的,对应的路标数量 <k,此时,我们的路标还有没有使用过的PS:路标增多,空旷指数一定是变小的
  • 所以,我们此时应该让r=mid从而达成空旷指数减少
    在这里插入图片描述
  • 因此,代码如下:
	int l=0,r=L;
    while(l+1<r)
    {
        int mid=(l+r)>>1;
        if(check(mid)) r=mid;	//第二类模型
        else l=mid;
    }

2.2:check()函数解析

bool check(int mid) //表示当前可以达到这个'空旷指数'
{
    int cnt=0;  //放置的目标数量
    int i=0;    //用来枚举每一个路标,
    int now=0;  //表示当前跳到了某个路标
    
    while(i<n+1)
    {
        i++;
        while(a[i]-now>mid) //说明此时的两个路标不符合条件
        {
            cnt++;
            now+=mid;       // 新增一个路标
        }
        now=a[i];    // 更新当前的位置为下一个路标的位置
    }
    if(cnt<=k) return true;
    else return false;
}
	bool check(int mid) //表示当前可以达到这个'空旷指数'
	int cnt=0;  //放置的目标数量
    int i=0;    //用来枚举每一个路标,
    int now=0;  //表示当前跳到了某个距离
  • 接下来我们来遍历每个路标while(i<n+1) i++
  • 此时我们需要考虑,假如两个原定的路标在插入一个路标之后,仍然不满足条件
    在这里插入图片描述
  • 1、如图所示,当我们在50--101之间插入了一个值之后,无论怎么插入,都是仍然不满足条件的
  • 2、因此我们想,那么我们应该怎么插才会使得我们在一次插入后能达到最远的距离呢?
  • 是不是应该是now+mid,这样我们就能使得这一次的插入性价比最高!!也就可以使得计算出这段距离的最少插入次数
  • 随后更新我们目前的位置就好now=a[i]
  • 最后比较cnt--k的值就好

三、完整代码如下:

#include<bits/stdc++.h>
using namespace std;

const int N=2e5;
int a[N];
int L,n,k;

bool check(int mid) //表示当前可以达到这个'空旷指数'
{
    int cnt=0;  //放置的目标数量
    int i=0;    //用来枚举每一个路标,
    int now=0;  //表示当前跳到了某个路标
    
    while(i<n+1)
    {
        i++;
        while(a[i]-now>mid) //说明此时的两个路标不符合条件
        {
            cnt++;
            now+=mid;       // 新增一个路标
        }
        now=a[i];    // 更新当前的位置为下一个路标的位置
    }
    if(cnt<=k) return true;
    else return false;
}




int main()
{
    cin>>L>>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }

    int l=0,r=L;
    while(l+1<r)
    {
        int mid=(l+r)>>1;
        if(check(mid)) r=mid;
        else l=mid;
    }
    
     cout<<r<<'\n';
    
	return 0;
}

http://www.kler.cn/a/502539.html

相关文章:

  • Linux第二课:LinuxC高级 学习记录day01
  • android framework.jar 在应用中使用
  • 备战蓝桥杯:树的存储与遍历(dfs和bfs)
  • 013:深度学习之神经网络
  • Java 将RTF文档转换为Word、PDF、HTML、图片
  • 深度学习-卷积神经网络反向传播梯度公式推导
  • 女性机器人有市场吗
  • Scaling Laws:通往更大模型的路径
  • Mysql常见知识点
  • Vulnhub DC-9靶机实战
  • 【深度学习】通俗理解偏差(Bias)与方差(Variance)
  • 野指针bug
  • 代码随想录day24 | leetcode 491.递增子序列 46.全排列 47.全排列 II
  • 【信息系统项目管理师】高分论文:论信息系统项目的采购管理(社会保险管理核心系统)
  • 第37周:咖啡豆识别 (Tensorflow实战第七周)
  • STL之VectorMapList针对erase方法踩坑笔记
  • iOS - Method Swizzling
  • 省市区三级联动(后端)
  • Java内存与缓存
  • Qt的.pro文件中宏的作用
  • 英伟达在CES 2025上的技术发布与采访综述
  • 【Qt笔记】QTextEdit和QPlainTextEdit 控件详解
  • Android车机DIY开发之软件篇(八)单独编译
  • 【机器视觉】OpenCV 图像轮廓(查找/绘制轮廓、轮廓面积/周长、多边形逼近与凸包、外接矩形)
  • 2. Scala 高阶语法之集合与元组
  • 网络原理(三)—— 传输层 之 UDP 和 TCP协议