侵略性奶牛(对于二分的总结)

2023-05-16

题目
Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,…,xN (0 <= xi <= 1,000,000,000). His C (2 <= C <= N) cows don’t like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?

农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,…,xN (0 <= xi <= 1,000,000,000). 但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢

输入:
第一行:空格分隔的两个整数N和C
第二行—第N+1行:i+1行指出了xi的位置

输出:
第一行:一个整数,最大的最小值

**样例输入**
5 3
1
2
8
4
9
**样例输出**
3

1. 将贪心问题转换为判定类问题

题目希望的求解最小距离最大,此类贪心问题往往可以转换为判定某一个条件(此处是距离)是否可以找到一个对应的解,在此我们只要实现一个函数 bool judge(int, int, int) 进行判定,即可解出某一情况是否有解也就是某一个距离能否满足题目所需要的每两只奶牛之间距离均不小于此距离。从而方便了我们在搜索区间上(此处是距离的区间:即最小距离0到最大距离两段牛棚的距离)探索最优解。

2. 二分法区间移动过程

探索可以使用遍历,当然二分是一个更好的策略,可以通过更低的时间复杂度来求解问题,重点说说。

解释:

我的理解是这样的,二分需要的条件就是有序,而这样的最值问题希望的答案就简单的绑定在我们的求解区间上,是区间的极值,因此和二分方法的思路是十分吻合的,因而使用二分的思路是合理的。

过程:

应当更加深刻的理解二分,二分是一种对于区间性质的划分。这里拿最简单的二分查找举例,二分查找的关键点不应当在middle对应的数是否是我希望查找的数,而应当是某一段区间应当被划定为什么样的状态。left和right指针需要将线性区间划分为三个部分:

  1. left左部区间内一定不存在要寻找的数。
  2. right右部区间内一定不存在要寻找的数。
  3. left本身到right本身区间内可能存在要寻找的数。

这样就应该更好理解其中的一些步骤,比如:

  1. middle比较不等之后为什么left = middle + 1或right = middle - 1而不是等于middle。因为middle此时也已经被确定为在不存在要寻找数的区间内了。
  2. 为什么循环终止的条件是left > right而不是>=。因为大于等于(>=)时还是能留下一段可能区间,只有在大于(>)时不存在要寻找的数的区间才会完全覆盖整个区间。

区间(指针)移动:

应用以上的思想就可以很好的解释本题的代码,区间被划分为三部分

  1. left左部区间内的距离一定是可以找到一种放置方案。
  2. right右部区间内的距离一定无法找到可行的放置方案。
  3. left本身到right本身区间内可能存在可行的放置方案。

这可以很好的解释为什么此处的二分不能够在中途跳出,必须完全实现,left<right时才能跳出,因为这里不是像二分查找一样的一锤子买卖,二分查找的区间划分是为查找数字服务的,并且两端划分出来的状态完全一致(均为不能查找数),因而好像占据了次要地位,且区间无用。但在这里划分出来的区间是主角,两侧划分的状态完全相对(一边能实现一边不能),结果需要通过区间去寻求极值。

按照划分含义来说这里的极值应当是left左边的第一个元素,表明可以求解的区间内最大的一个值,而输出right对应的数只是由于right在二分结束时正好处于left右边第一个数,应当透过这样的取巧明确其本身的含义。

#include <iostream>
#include <algorithm>
using namespace std;

const int MAX = 1e5 + 10;

int arr[MAX];

/*
 * 二分查找
 * n: 数组长度
 * m: 需要划分的份数
 * distance: 当前作为判定对象的距离
 * 目的:判断当前的distance是否能够找到满足条件的解
 */
bool judge(int n, int m, int distance){
    int current = arr[0];
    int number = 1;
    for(int i = 1; i < n; i++){
        if(arr[i] - current >= distance){
            number++;
            current = arr[i];
        }

        if(number >= m){
            return true;
        }
    }
    return false;
}

int main(){
    int n, m;
    while(cin >> n >> m) {
        for (int i = 0; i < n; i++) {
            cin >> arr[i];
        }

        // 排序,二分查找需要有序
        sort(arr, arr + n);

        // 二分,left左侧为可求解,right右侧为不可求解
        int left = 1, right = arr[n - 1] - arr[0];
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (judge(n, m, mid)) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        cout << right << endl;
    }
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

侵略性奶牛(对于二分的总结) 的相关文章

  • 使用vscode做得基础配置自动保存格式化

    vscode默认启用了根据文件类型自动设置tabsize的选项 34 editor detectIndentation 34 false 重新设定tabsize 34 editor tabSize 34 2 每次保存的时候自动格式化 34
  • OOQP 使用教程 c++

    最近学习了一下OOQP的使用在这里记录一下 在matlab代码中是quadprog xff0c 而这次使用OOQP也主要是为了计算二次规划问题 安装OOQP 首先是安装问题 xff0c 不得不说 xff0c 当时安装也花了不少时间 xff0
  • 物联网工程 | CAN(Controller Area Network)控制器局域网络答疑

    文章目录 概述一 CAN的物理设备二 CAN的物理传输三 CAN的多设备连接四 CAN编程 概述 本节以问答方式讲述CAN相关的一些疑点问题 一 CAN的物理设备 问 xff1a CAN需要什么样的物理设备支持才能算一个CAN网络 系统 x
  • 【无标题】

    前言 对于喜欢逛CSDN的人来说 xff0c 看别人的博客确实能够对自己有不小的提高 xff0c 有时候看到特别好的博客想转载下载 xff0c 但是不能一个字一个字的敲了 xff0c 这时候我们就想快速转载别人的博客 xff0c 把别人的博
  • VSCode中针对C语言的代码格式化配置

    默认格式化工具 打开设置 Ctrl 43 xff0c 选择 用户 配置 xff0c 找到 文本编辑器 Default Formatter xff1a 安装了C C 43 43 插件后 xff0c 即可选择 xff1a C C 43 43 m
  • 总结的常用的前端开发中的常见套路之购物车页面

    1 商品的全选和全不选 获取页面中全选框所在的input xff0c 绑定其变change事件获取全选框的状态遍历获取商品对应的CheckBox xff0c 设置其选中状态和全选的保持一致同时 xff0c 当全选框状态发生变化时 xff0c
  • restframework权限,认证,限流配置

    认证Authentication DRF框架的默认全局认证方案如下 REST FRAMEWORK 61 39 DEFAULT AUTHENTICATION CLASSES 39 39 rest framework authenticatio
  • seek()方法的使用

    seek xff08 xff09 方法的使用 seek 方法用于移动文件读取指针到指定位置 file seek 方法标准格式是 xff1a file seek offset whence offset xff1a 开始的偏移量 xff0c
  • 为什么QQ用的是UDP协议而不是TCP协议?

    QQ既有UDP也有TCP xff01 不管UDP还是TCP xff0c 最终登陆成功之后 xff0c QQ都会有一个TCP连接来保持在线状态 这个TCP连接的远程端口一般是80 xff0c 采用UDP方式登陆的时候 xff0c 端口是800
  • 五分钟读懂TCP 协议——TCP协议简介

    TCP 是互联网核心协议之一 xff0c 本文介绍它的基础知识 一 TCP 协议的作用 互联网由一整套协议构成 TCP 只是其中的一层 xff0c 有着自己的分工 xff08 图片说明 xff1a TCP 是以太网协议和 IP 协议的上层协
  • JSON模块基本使用

    usr bin python3 coding utf 8 import json json loads 把json字符串转成 python 对象 json string 61 39 39 39 34 a 34 34 x 34 34 b 34
  • c语言中return的各种用法 建议收藏

    按初学的理解 xff0c return的任务就是返回对应的参数 xff0c 在外层函数中对这个参数做进一步处理 实际上return的用法不只这些 为调用的函数返回参数值 此类应用最为普遍 xff0c 通常是在一个具有返回值的函数中 xff0
  • chatgpt的原理 第一部分

    前言 这两天 xff0c ChatGPT模型真可谓称得上是狂拽酷炫D炸天的存在了 一度登上了CSDN热搜 xff0c 这对科技类话题是非常难的存在 不光是做人工智能 机器学习的人关注 xff0c 而是大量的各行各业从业人员都来关注这个模型
  • 自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第一部分

    我是去年9月22日才正式学习Java的 xff0c 因为在国营单位工作了4年 xff0c 在天津一个月工资只有5000块 xff0c 而且看不到任何晋升的希望 xff0c 如果想要往上走 xff0c 那背后就一定要有关系才行 而且国营单位的
  • 自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第二部分

    我的学习心得 xff0c 我认为能不能自学成功的要素有两点 第一点就是自身的问题 xff0c 虽然想要转行学习Java的人很多 xff0c 但是非常强烈的想要转行学好的人是小部分 而大部分人只是抱着试试的心态来学习Java xff0c 这是
  • 深入理解任务堆栈以及堆栈溢出

    前言 xff1a 在多任务操作系统中创建任务时 xff0c 都需要指定该任务的堆栈大小 xff0c 那么这个堆栈的作用时什么呢 xff1f 什么情况下需要用到堆栈 xff0c 以及大小不够时会产生什么异常呢 xff1f 1 任务状态 简单分
  • 计算机网络的166个概念你知道几个 第四部分

    HTML xff1a HTML 称为超文本标记语言 xff0c 是一种标识性的语言 它包括一系列标签 xff0e 通过这些标签可以将网络上的文档格式统一 xff0c 使分散的 Internet 资源连接为一个逻辑整体 HTML 文本是由 H
  • 15000 字的 SQL 语句大全 第一部分

    一 基础 1 说明 xff1a 创建数据库CREATE DATABASE database name 2 说明 xff1a 删除数据库drop database dbname 3 说明 xff1a 备份sql server 创建 备份数据的
  • 毕业设计源码基于springboot的旧物置换系统的实现

    摘 要 随着时代在一步一步在进步 xff0c 旧物也成人们的烦恼 xff0c 许多平台网站都在推广自已的产品像天猫 咸鱼 京东 所以开发出一套关于旧物置换网站成为必需 旧物置换网站主要是借助计算机 xff0c 通过对用户进行管理 为减少管理
  • 毕业设计源码基于Spring Boot的论坛管理系统的实现

    摘要 xff1a 在社会快速发展的影响下 xff0c 论坛管理系统 继续发展 xff0c 使 论坛管理系统 的管理和运营比过去十年更加 信息化 依照这一现实为基础 xff0c 设计一个快捷而又方便的网上 论坛管理系统 是一项十分重要并且有价

随机推荐

  • 毕业设计源码基于Spring Boot的旅游管理系统的实现

    摘 要 社会的发展和科学技术的进步 xff0c 互联网技术越来越受欢迎 网络计算机的 交易 方式逐渐受到广大人民群众的喜爱 xff0c 也逐渐进入了每个 用户 的使用 互联网具有便利性 xff0c 速度快 xff0c 效率高 xff0c 成
  • 轮询、中断和DMA三种方式的原理和联系

    CPU控制外部设备的方式 xff1a 中断 轮询 DMA 轮询中断DMA 由于外部设备的速度差异 xff0c CPU可以使用不同的方式控制外部设备的访问 常见的方式轮询 中断和DMA 轮询 轮询最简单 xff0c CPU通过不断地查询某个外
  • OpenMV识别色块与STM2F4通过串口通信

    花了三天时间学习了一下OpenMV的简单使用 xff0c 在这写个博客记录一下 xff0c 并且上传自己的代码 xff0c 以方便交流学习 第一次发帖 xff0c 不周之处见谅 首先概括一下我实现的功能 xff1a OpenMV识别红色色块
  • c++语言简单提问

    1 定义一个空的类型 xff0c 里面没有任何成员变量和成员函数 对该类型求sizeof xff0c 得到的结果是 1 2 为什么不是0 空类型的实例中不包含任何信息 xff0c 本来求sizeof应该是0 xff0c 但是当我们声名该类型
  • 二 ROS通信机制-话题通信(发布订阅模式)

    二 ROS通信机制 话题通信 发布订阅模式 ROS 中的基本通信机制2 1话题通信 发布订阅模式 2 1 1概念2 1 2作用2 1 3 理论模型2 1 4 话题通信应用时需要关注的地方 xff1a 3 简单实现3 1ROS工作空间建立 x
  • 解决ROS中运行launch文件报错ERROR: cannot launch node of type[xxx/xxx]:xxx的问题

    解决ROS中运行launch文件报错ERROR cannot launch node of type xxx xxx xxx的问题 错误截图 xff1a 原因 xff1a 解决方式 xff1a 当时我出现的错误是 ERROR cannot
  • c++ stl 五种迭代器

    c 43 43 stl 五种迭代器 2010 12 31 14 22 25 分类 xff1a C 43 43 C 举报 字号 订阅 下载LOFTER 我的照片书 迭代器的分类 Iterator Categories I
  • C语言头文件中定义变量问题(转)

    上个星期回学校的时候 xff0c 刚好碰到一个学弟在写程序 xff0c 并且刚好碰到一个总编不过去的问题 xff0c 我看了看 xff0c 正好是个头文件重复包含问题 xff0c 问题描述如下 xff1a 他在程序中建立了一个global
  • Opencv Aruco识别(python)

    效果图 先上效果 代码 直接上代码 xff1a span class token operator span span class token operator span usr span class token operator span
  • Windows下Cmake安装步骤详解(图文)

    文章目录 Cmake介绍Cmake下载及安装 Cmake介绍 CMake是一个跨平台的安装 xff08 编译 xff09 工具 xff0c 可以用简单的语句来描述所有平台的安装 编译过程 xff0c 并且输出对应的makefile或者pro
  • C语言:通过指针模拟实现strcat函数

    模拟实现strcat strcat函数的功能 把src所指向的字符串 xff08 包括 0 xff09 复制到dest所指向的字符串后面 xff08 删除dest原来末尾的 0 xff09 要保证dest足够长 xff0c 以容纳被复制进来
  • C语言中将字符串拆分再进行拼接

    我们有时候需要对于字符串进行操作 xff0c 主要用到strcat和strtok两个函数 xff0c 因此记录下这次的操作方式以便之后查阅 span class token macro property span class token d
  • 并行编程实现矩阵乘法优化

    实现四种矩阵乘法程序 xff0c 并对比运行效率 1 xff09 串行算法 2 xff09 Catch优化 3 xff09 SSE版本 4 xff09 分片策略 span class token macro property span cl
  • c++的函数reserve()和unique()和sort()

    函数reserve span class token comment vector reserve span span class token macro property span class token directive keywor
  • 关于c中代码加 ‘\‘ 进行换行的说明

    我们在c与c 43 43 中经常会遇到一种情况就是加 进行换行来保持代码整体结构一致的使用情况 xff0c 那么具体来说换行的规则是什么 xff0c 这里进行一下记录 span class token macro property span
  • git的命令总结

    先把清单列出来git cheat sheet git 命令总结 git的init和git clonegit add和git commit 提交二连git checkout 反向操作git reset 回退HEAD指针git revert 同
  • 宏定义中的可变参数 __VA_ARGS__ 用法 与 #和##的用法

    首先了解一下可变参数 span class token macro property span class token directive keyword include span span class token string lt st
  • C++结构体简单链表原理解释

    对结构体简单链表原理的简单解释 xff0c 程序如下 xff1a struct lianbiao int no string name struct lianbiao next lianbiao head 61 nullptr tail 6
  • linux小连招

    Linux命令目录 查看当前shell的种类find命令查找文件 查看当前shell的种类 查看当前发行版可以使用的shell xff1a chao 64 chao span class token function cat span et
  • 侵略性奶牛(对于二分的总结)

    题目 Farmer John has built a new long barn with N 2 lt 61 N lt 61 100 000 stalls The stalls are located along a straight l