Aggressive cows-疯牛POJ(2456)-详解

2023-11-16

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

输入
    有多组测试数据,以EOF结束。
    第一行:空格分隔的两个整数N和C
    第二行——第N+1行:分别指出了xi的位置
输出
    每组测试数据输出一个整数,满足题意的最大的最小值,注意换行。
样例输入

    5 3
    1
    2
    8
    4
    9

样例输出

    3

解题思路:此题表达的意思是:把 C头牛放进 N个带编号的隔间中,使得任意两头的隔间距离(位置的最小差值)最大。以输入样例为例,将3头牛放进编号为1、4、8的隔间,则这3头牛所在的隔间的距离为3、4、7,最短距离为 3.不可能找到比 3还要大的最小距离。假设任意两头牛的编号差值都大于3,考虑贪心算法,按间隔编号从小到大分配,第一头牛放进编号1的隔间,则第二头牛至少需要放进编号8的隔间,此时,第三头牛只能进入编号9的隔间,而9-8=1<3,与假设矛盾。
这道题是一个最小值最大化的问题。这类问题不易直接求解,可尝试简化问题,将求最小值问题转化为判断性问题:判断最小距离为X时是否可放下C头牛。那么目标就转化为从小到大枚举X,判断是否可行,直到找到第一个可行的X,则这个X就是答案。为了进一步加快算法速度,可使用二分查找替换顺序枚举。
因此,问题现在转化为判定性问题和二分查找
(1)判断问题:使用贪心算法,对隔间的编号从小到大的排序,从最小编号的隔间开始,每次分配距离尽可能近的隔间,看最后能否分配下C头牛
(2)二分查找:最小距离left=0,最大距离right=L[N-1]-L[0]。此时的二分查找是要找到最小满足条件的目标元素,相当于查找重复出现的元素第一次出现的位置。也要注意循环结束的条件和返回值。

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std; 
const int INF = 9999999;
//输入
int N,M;
int x[100];
//判断是否满足条件
bool C(int d){
    int last = 0;
    for(int i=1;i<M;i++){
        int crt = last + 1;
        while(crt < N && x[crt] - x[last] < d){
            crt++;
        } 
        if(crt == N)
            return false;
        last = crt; 
    } 
    return true;
} 
void solve(){
    //最开始时对 x数组排序
    sort(x,x+N); 
    //初始化解的存在范围
    int lb = 0;
    int ub = INF;
    while(ub - lb > 1){
        int mid = (lb + ub)/2;
        if(C(mid)){
            lb = mid;
        } else{
            ub = mid;
        } 
    } 
    printf("%d\n",lb); 
} 
int main(){
    cin>>N>>M;
    for(int i=0;i<N;i++){
        cin>>x[i]; 
    } 
    solve();
    return 0;
} 

有什么不懂可以在评论区问我,我会及时回答的,感谢阅读,希望能帮到您!

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

Aggressive cows-疯牛POJ(2456)-详解 的相关文章

  • 二分查找,你真的掌握了吗?

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 8937978 二分查找 xff0c 最基本的算法之一 xff0c
  • 数据结构实验之查找四:二分查找

    数据结构实验之查找四 xff1a 二分查找 Time Limit 30 ms Memory Limit 65536 KiB Submit Statistic Discuss Problem Description 在一个给定的无重复元素的递
  • 数组-二分查找

    1 Search a 2D Matrix 1 1 题目描述 span class token comment You are given an m x n integer matrix matrix with the following t
  • 二分查找,你真的掌握了吗?

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 8937978 二分查找 xff0c 最基本的算法之一 xff0c
  • 超易懂!二分查找 详析

    二分算法的 本质 是 xff1a 假如我们可以找到事物的 某种性质 xff0c 这种性质 可以将区间一分为二 xff0c 一半满足 xff0c 一半不满足 我们就可以二分 另外 xff0c 有 连续性 必可以 二分 二分模板一共有两个 xf
  • 算法:二分查找

    给定一个n个元素有序的 xff08 升序 xff09 整型数组 nums 和一个目标值 target xff0c 写一个函数搜索 nums 中的 target xff0c 如果目标值存在返回下标 xff0c 否则返回 1 1 条件 查找的数
  • 二分查找BinarySearch原理分析、判定树、及其变种

    二分查找BinarySearch 1 二分查找及其要求 二分查找 又叫折半查找 是一种效率较高的查找算法 1 二分查找的要求 线性表是有序表 即表中结点按关键字有序 并且要用向量作为表的存储结构 不妨设有序表是递增有序的 存储结构 二分查找
  • 【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?

    文章目录 前言 什么是二分查找算法 1 二分查找 1 1 题目要求 1 2 做题思路 1 3 Java代码实现 2 在排序数组中查找元素的第一个和最后一个位置 2 1 题目要求 2 2 做题思路 2 3 Java代码实现 3 搜索插入位置
  • 【牛客面试必刷TOP101】Day4.BM15删除有序链表中重复的元素-I和BM17二分查找-I

    作者简介 大家好 我是未央 博客首页 未央 303 系列专栏 牛客面试必刷TOP101 每日一句 人的一生 可以有所作为的时机只有一次 那就是现在 文章目录 前言 一 删除有序链表中重复的元素 I 题目描述 解题分析 二 二分查找 I 题目
  • C++:采用vector实现二分查找及其变种总结

    主要分为六种情况 闭区间 半开区间 中位值在循环之外的半开区间二分查找首个序列 中位值在循环之外的半开区间二分查找末尾序列 以及中位值在循环之外的完全开区间二分查找首个序列和中位值在循环之外的完全开区间二分查找末尾序列 include
  • 【C语言】二分查找(含图解)

    文章目录 1 二分查找思想 2 代码实现 2 1 未封装函数 2 2 封装函数 使用while循环 2 3 封装函数 使用递归 1 二分查找思想 二分法 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法 其思想就是不断地将有序查找表
  • ?101 Redraiment的走法【梅花桩】【最长上升子序列】

    题目描述 题目描述 Redraiment是走梅花桩的高手 Redraiment总是起点不限 从前到后 往高的桩子走 但走的步数最多 不知道为什么 你能替Redraiment研究他最多走的步数吗 样例输入 6 2 5 1 5 4 5 样例输出
  • Leetcode刷题209. 长度最小的子数组

    给定一个含有 n 个正整数的数组和一个正整数 target 找出该数组中满足其和 target 的长度最小的 连续子数组 numsl numsl 1 numsr 1 numsr 并返回其长度 如果不存在符合条件的子数组 返回 0 示例 1
  • 记录-常见算法的收集

    1 快速排序 找到基准点的位置 既不浪费空间又可以快一点的排序算法 如 6 1 2 7 9 3 4 5 10 8 这10个数进行排序 首先找到一个数作为基准点 一个参照数 为了方便 让第一个数6作为基准点 然后将这个序列中所有比基准数大的数
  • 元素和小于等于阈值的正方形的最大边长

    LeetCode 1292 元素和小于等于阈值的正方形的最大边长 给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold 请你返回元素总和小于或等于阈值的正方形区域的最大边长 如果没有这样的正方形区域 则返回 0 示
  • 二分查找(Binary Search) 常见问题解决方法总结

    缘由 今天浏览 何登成的技术博客 无意中发现了写的blog 二分查找 Binary Search 需要注意的问题 以及在数据库内核中的实现 随想总结下二分查找的常见问题 问题背景 今年的实习生招聘考试 我出了一道二分查找 Binary Se
  • java实现二分查找-两种方式

    二分查找是一种查询效率非常高的查找算法 又称折半查找 起初在数据结构中学习递归时实现二分查找 实际上不用递归也可以实现 毕竟递归是需要开辟额外的空间的来辅助查询 本文就介绍两种方法 二分查找算法思想 有序的序列 每次都是以序列的中间位置的数
  • Aggressive cows-疯牛POJ(2456)-详解

    描述 农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000 000 但是 John的C 2 lt C lt N 头牛们并不喜欢这
  • python之折半查找算法

    折半查找算法也叫二分查找算法 算法的细节我就不讲了 但是必须说一下二分查找是基于我们之前的数据是有序的 如果没有序该算法是没有意义的 个人觉得代码比较直观 所以我这里就直接上代码了 折半查找非递归算法 折半查找非递归算法 折半查找函数 参数
  • CH7-查找

    文章目录 1 查找的基本概念 2 线性表的查找 2 1 顺序查找 线性查找 算法2 1 0 类型定义 算法2 1 1 顺序查找 算法2 1 2 改进后的顺序查找 性能分析 2 2 折半查找 二分或对分查找 算法2 2 1 非递归算法 算法2

随机推荐

  • MATLAB算法实战应用案例精讲-【异常检测】OCSVM算法(附Python和MATLAB代码)

    目录 前言 几个高频面试题目 1 OneClass 与二分类 多分类的区别
  • 计算机体系结构基础知识介绍之缓存性能的十大进阶优化之非阻塞缓存(四)

    优化四 非阻塞缓存 提高缓存带宽 对于允许乱序执行的流水线计算机 处理器不需要因数据高速缓存未命中而停止 例如 处理器可以继续从指令高速缓存获取指令 同时等待数据高速缓存返回丢失的数据 非阻塞高速缓存或无锁高速缓存允许数据高速缓存在未命中期
  • 继承中方法的覆盖重写_概念与特点,

    重写 Override 概念 在继承关系当中 方法的名称一样 参数列表也一样 重写 Override 方法的名称一样 参数列表 也一样 覆盖 覆写 重载 Overload 方法的名称一样 参数列表 不一样 方法的覆盖重写特点 创建的是子类对
  • 必刷算法题之字符串(题目及代码)---C++

    文章目录 第1题 执行操作后的变量值 第2题 罗马数字转整数 第3题 句子中的最多单词数 第4题 左旋转字符串 第5题 宝石与石头 第6题 Excel 表中某个范围内的单元格 第7题 括号的最大嵌套深度 第8题 分割平衡字符串 第9题 最长
  • CACC 协同式自适应巡航模型 搭建四辆车在carsim和simulink进行协同式自适应巡航 其中间距策略考虑领航车速的影响,各个车辆采用分层式控制,分层式控制器主要分为下层控制

    CACC 协同式自适应巡航模型 仿真软件版本 Carsim2016 Matlab2018b及以上 搭建四辆车在carsim和simulink进行协同式自适应巡航 其中间距策略考虑领航车速的影响 各个车辆采用分层式控制 分层式控制器主要分为下
  • ubuntu 22.04 安装 Docker Desktop 及docker介绍

    目录 一 Docker Desktop 安装 1 我们先去官网下载安装包 2 Install Docker Desktop on Ubuntu 3 Launch Docker Desktop 二 Docker 介绍 什么是docker 如何
  • 启动mongodb数据库 mongo命令时回报计算机拒绝访问

    当你没有启动mongodb数据库的时候 bin目录下输入mongo命令时回报计算机拒绝访问 这个时候解决办法是进入bin目录输入mongodb exe dbpath c data db dbpaht 后面一定要加 双引号 否则会报错误
  • NODE.JS--如何使用Node.js

    简单的说 Node js 就是运行在服务端的 JavaScript Node js 是一个基于Chrome JavaScript 运行时建立的一个平台 Node js是一个事件驱动I O服务端JavaScript环境 基于Google的V8
  • vscode remote server tunnel内网穿透转发tcp,速率10kb每秒

    参考 vscode网页版的正确打开方式 建立tunnel p2p连接 vscode打开网页 怪力左手的博客 CSDN博客 vscode内网穿透 白嫖10M带宽穿透 remote tunnels远程开发插件 不嫖白不嫖 哔哩哔哩 bilibi
  • 深入浅出的讲解傅里叶变换

    作 者 韩 昊 知 乎 Heinrich 微 博 花生油工人 知乎专栏 与时间无关的故事 谨以此文献给大连海事大学的吴楠老师 柳晓鸣老师 王新年老师以及张晶泊老师 转载的同学请保留上面这句话 谢谢 如果还能保留文章来源就更感激不尽了 其实学
  • Ubuntu 安装 CUDA(附测试)

    为深度学习所用 博主预想在Ubuntu16 04上安装 显卡驱动 CUDA cuDNN Tensorflow gpu Keras PyCharm 参考了众多资料 最终成功将所有软件安装完毕 且能成功运行使用 该篇博客介绍了CUDA的安装教程
  • 2023-详解实时数仓建设

    一 实时数仓建设背景 1 实时需求日趋迫切 目前各大公司的产品需求和内部决策对于数据实时性的要求越来越迫切 需要实时数仓的能力来赋能 传统离线数仓的数据时效性是 T 1 调度频率以天为单位 无法支撑实时场景的数据需求 即使能将调度频率设置成
  • 接口优化从哪些方面入手?

    关注公众号 1024个为什么 及时接收最新推送文章 1 背景 新接手的一个服务 对整个服务熟悉后 发现调用量 TOP1 的一个接口 完全超乎我对这个接口使用场景的预期 预期几万的接口 实际调用量近 400万 和调用方交涉后 暂时无法推动调用
  • Conexant Bt878驱动及视频软件开发

    目录 1 前言 2 驱动开发 3 视频软件开发 3 1 DX SDK版本选择 3 2 directshow开发 4 寄存器配置 5 参考资料 1 前言 本文是对基于Conexant Bt878进行的驱动开发和软件开发进行的整理论述 驱动是基
  • java项目如何远程调试

    唠嗑部分 很多java开发的小伙伴不知道java项目如何远程调试 每次出现环境问题都会十分纠结 只能在源代码中通过一行一行的日志去排查 即没有技术含量也浪费时间 今天来说一说 java项目如何远程debug Java XDebug 远程de
  • <微机与接口技术>51单片机的指令系统——数据传送与交换指令

    重要指令符号 Rn 当前工作寄存器组中的R0 R7 Ri 当前工作寄存器组中的R0 R1 rel 相对偏移量 在相对转移指令中使用 位一字节补码 寻址方式 七种分别是立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址
  • 超详细的springBoot学习教程

    springBoot学习 https docs spring io spring boot docs 2 2 6 RELEASE reference html index html 官方文档 1 搭建springBoot项目架构 2 spr
  • C#执行JavaScript脚本

    目录 安装和配置 执行 JavaScript 脚本 与脚本交互 JS 调用 C 方法 多线程使用 总结 ClearScript 是一个 NET 平台下的开源库 用于在 C 和其他 NET 语言中执行脚本代码 它提供了一种方便和安全的方法来将
  • Windows操作系统知识合集

    Windows操作系统的权限 Guest权限 User权限 人类可用普通权限 Administrator 人类可用最高权限的用户 System 系统 机器可用最高权限 比人类权限高更多 TrustInstaller 操作系统的最高权限 比S
  • Aggressive cows-疯牛POJ(2456)-详解

    描述 农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000 000 但是 John的C 2 lt C lt N 头牛们并不喜欢这