洛谷 P1824 进击的奶牛 【二分答案】(求最大的最小值)

题目链接:https://www.luogu.org/problemnew/show/P1824

题目描述

Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000,000)。

他的C(2<=C<=N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?

输入格式:

第1行:两个用空格隔开的数字N和C。

第2~N+1行:每行一个整数,表示每个隔间的坐标。

输出格式:

输出只有一行,即相邻两头牛最大的最近距离。

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

解题思路:
像这种求最大最小值,最小最大值得问题都是典型的二分答案题,二分答案的主要难点在于juge()函数,此题下面给出了两个不同思路的juge函数。

要注意的是如何根据所枚举的答案来将隔间分隔,因为求的是最大的最近距离,这个距离要是每一次分隔距离中最短的。接下来分析,假设隔间的坐标没有规定在哪的话,那么什么时候最近距离最大呢?毫无疑问,是当所有的距离
相同的时候,最近距离最大。但是此题每个隔间的坐标有规定,使得不一定能使每一段的距离都能够相等,所以,此时求最近距离的最优思路就是:

   每一段区间距离都应该大于或等于m(但要尽可能的接近最近距离),这样才能使最近距离最大
 所以一旦所枚举的隔间距离恰好大于最近距离的时候,就在该隔间放牛,毫无疑问,这样得到的最近距离才会尽可能的大

 

第一种juge()函数

bool juge(int m)//判断距离m是否可以 
{int s = 0, last = 1;//记录上一个 for (int i = 2; i <= n; i++)//依次枚举每个牛栏 
    {if (a[i] - a[last]<m)s++;//若此距离不满足当前答案,那么需要的牛栏数+1,即把当前牛放到下一个牛栏 else last = i;//否则就更新上一次的牛栏位置 ,即上一头牛放的位置 if (s>n - c) return false;//若需要牛栏数大于最大牛栏数,此答案不可行 
    }return true;
}

第二种juge()函数
bool juge(int m)              
{int ans = 1, last = 1;           //因为第一个牛一定要占据第一个隔间(这样能使本题的答案最优),所以ans初始化为1for (int i = 2; i <=n; i++){if (a[i] - a[last] >= m){ans++;           //如果比最近距离要大的话,那么该隔间就放牛   last = i;                                               }}if (ans >= c)return true;          return false;
}
 

 

本题代码

#include <bits/stdc++.h>
using namespace std;
int a[100010];
int l, r;
int n,c;/*bool juge(int m)//判断距离m是否可以 
{int s = 0, last = 1;//记录上一个 for (int i = 2; i <= n; i++)//依次枚举每个牛栏 {if (a[i] - a[last]<m)s++;//若此距离不满足当前答案,那么需要的牛栏数+1,即把当前牛放到下一个牛栏 else last = i;//否则就更新上一次的牛栏位置 ,即上一头牛放的位置 if (s>n - c) return false;//若需要牛栏数大于最大牛栏数,此答案不可行 }return true;
}*/bool juge(int m)              
{int ans = 1, last = 1;           //因为第一个牛一定要占据第一个隔间(这样能使本题的答案最优),所以ans初始化为1for (int i = 2; i <=n; i++){if (a[i] - a[last] >= m){ans++;           //如果比最近距离要大的话,那么该隔间就放牛   last = i;                                               }}if (ans >= c)return true;          //如果所选取的隔间数量>=c,则说明枚举的最近距离成立,但是不够大,所以return true,继续枚举更大的距离return false;
}int main()
{cin >> n >> c;for (int i = 1; i <=n; i++)cin >> a[i];l = 1; r = a[n] - a[1];           //右边界为n个隔间的总长度,最近距离一定小于等于这个数值sort(a + 1, a + 1 + n);while (l <= r){int mid = (l + r)/2;if (juge(mid))l = mid+1;       //如果当前枚举的最近距离符合,那么就让l=mid,看更大的距离是否也符合(因为要求最大的最近距离)elser = mid-1;}cout << r<< endl;    //由于最后l<=r的时候还会运行一次,会让l-1(如果答案正确的话),所以应该输出的是rreturn 0;
}
 

2018-05-20

转载于:https://www.cnblogs.com/00isok/p/9063340.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《中国基础研究竞争力报告2020》发布,6图表速览报告核心结论

来源&#xff1a; 科学出版社持续跟踪先进国家基础研究发展态势&#xff0c;准确研判我国基础研究竞争力&#xff0c;科学筹划基础研究发展&#xff0c;对于打造科技核心竞争力、构筑先发优势、蓄积长远发展原动力&#xff0c;具有重要战略意义。为了支撑科技创新&#xff0c;中…

异步通信在生活中的例子_AJAX简单异步通信实例分析

本文实例讲述了AJAX简单异步通信的方法。分享给大家供大家参考。具体分析如下&#xff1a;客户端&#xff1a;向服务器发出一个空请求。代码如下&#xff1a;XMLHttpRequestvar xmlHttp;function createXMLHttpRequest(){if(window.ActiveXObject)xmlHttp new ActiveXObject(&…

计算机仿真在机械行业中的应用,计算机仿真技术机械行业应用

计算机仿真技术在机械行业应用计算机仿真技术在机械行业应用14级在职机械工程硕士 刘中华摘 要: 计算机仿真技术是以多种学科和理论为基础&#xff0c;以计算机及其相应的软件为工具&#xff0c;通过虚拟试验的方法来分析和解决问题的一门综合性技术。计算机仿真(模拟)早期称为…

svn 修改文件的可执行权限

设置svn可执行权限&#xff0c;svn:executable 1)svn propset svn:executable on 文件名&#xff0f;文件夹名 2)svn propset svn:executable on test.c svn ci 转载于:https://www.cnblogs.com/wangliangblog/p/9072690.html

「九章」刷屏的背后:万字长文解析,量子计算机和电子计算机各有何优劣?

来源&#xff1a;机器学习研究组订阅号近日&#xff0c;中科大校友、UC伯克利在读博士、知乎用户SIY.Z 在一篇近两万字的长文中&#xff0c;详细分析了“量子计算机和传统电子计算机在算法方面的优劣势”。以下是原文内容:这是一篇我很早以前就想写的文章。我的目的是给稍有数学…

关于计算机的网络作文,关于网络世界的作文

关于网络世界的作文在学习、工作乃至生活中&#xff0c;大家对作文都不陌生吧&#xff0c;根据写作命题的特点&#xff0c;作文可以分为命题作文和非命题作文。那么你有了解过作文吗&#xff1f;以下是小编精心整理的关于网络世界的作文&#xff0c;欢迎阅读&#xff0c;希望大…

python实现邮件客户端_利用python实现简单的邮件发送客户端示例

脚本过于简单&#xff0c;供学习和参考。主要了解一下smtplib库的使用和超时机制的实现。使用signal.alarm实现超时机制。#!/usr/bin/env python# -*- coding: utf-8 -*-import timeimport sysimport loggingimport smtplibimport socketimport signalimport ConfigParserfrom …

xml--Schema约束

<?xml version"1.0" encoding"UTF-8"?> <!-- xmlns: xml namespace&#xff1a;名称空间/ 命名空间 targeNamespace&#xff1a;目标名称空间&#xff0c;下面定义的那些元素都与这个名称空间绑定上 elementFormDefault&#xff1a; 元素的格式…

js中实现页面跳转(返回前一页、后一页)

一&#xff1a;JS 重载页面&#xff0c;本地刷新,返回上一页 代码如下:<a href"javascript:history.go(-1)">返回上一页</a> <a href"javascript:location.reload()">重载页面&#xff0c;本地刷新</a> <a href"javascri…

stm32 文件系统dma大小_STM32 DMA使用详解

DMA部分我用到的相对简单&#xff0c;当然&#xff0c;可能这是新东西&#xff0c;我暂时还用不到它的复杂功能吧。下面用问答的形式表达我的思路。DMA有什么用&#xff1f;直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预&…

管理计算机域内置账户改为用户账户,“管理计算机(域)的内置帐户”我给它改了名...

在Windows XP中&#xff0c;Administrator帐户是终极管理员&#xff0c;如果你创建了其他管理员帐户&#xff0c;那么该帐户就会从欢迎屏幕上被隐藏。这里需要注意的是&#xff0c;仅仅是从欢迎屏幕上被隐藏&#xff0c;该帐户仍然存在。如果你仍然需要使用这个帐户&#xff0c…

程序架构--BS,CS

程序架构 C/S(client/server) QQ 微信 LOL 优点&#xff1a;有一部分代码写在客户端&#xff0c;用户体验比较好 缺点&#xff1a;服务器更新&#xff0c;客户端也随着更新&#xff0c;占用资源大 B/S(browser/server) 网页游戏&#xff1a;WebQQ ... 优点&#xff1a;客…

被称为“第五代 AI”的神经形态计算进展到哪一步了?

来源&#xff1a;北京物联网智能技术应用协会AI可以像人脑一样运作吗&#xff1f;几十年来&#xff0c;研究人员一直在问这个问题&#xff0c;这个大家长期求索的问题引起了质疑、嘲笑、轻蔑等不同态度。但是现在&#xff0c;神经形态计算让世界变得更美好的梦想更近了一些。当…

AngularJS学习笔记(一)

一.基本指令 1、ng-app" " 指令初始化一个 AngularJS 应用程序,定义angularJS的使用范围;tips:一个页面里创建多个 ng-app 手动加载即可:var app1 angular.module("app1", []); var app2 angular.module("app2", []); angular.bootstrap(docum…

oc 画一个圆弧_UG建模一个蜗杆的方法,纯手工建模无插件

上次我们画了一个蜗杆&#xff0c;今天就来建模一个涡轮模型&#xff0c;也是非常简单。这次还是无尺寸的随意建模&#xff0c;做出这么一个涡轮&#xff0c;来看看建模方法吧&#xff01;1 首先在XY平面上绘制一个直径100的圆&#xff0c;上下拉伸10mm2 对圆柱上下面倒斜角3mm…

计算机基本网络测试命令实验报告,网络连通性测试与网络命令验证实验报告

网络连通性测试与网络命令验证实验报告西工大计算机网络原理实验报告网络原理实验报告实验名称&#xff1a; 网络连通性测试与网络命令验证 日期&#xff1a; 2015.11&#xff0e;09 班级&#xff1a;学号&#xff1a; 姓名&#xff1a;【一】 预习内容5个常用网络命令&#xf…

Leetcode--11. 盛水最多的容器

给定 n 个非负整数 a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多…

《城市大脑全球标准研究报告》发布会将于12月23号在北京举办

城市大脑全球标准研究组《城市大脑全球标准研究报告》发布会将于2020年12月23日下午在北京海淀区城市大脑展览厅举办&#xff0c;发布会除了报告发布&#xff0c;智能产业专家演讲&#xff0c;也将参观海淀城市大脑的发展情况。欢迎新闻媒体、科研机构、科技企业、政府部门的记…

竞态条件与临界区

在同一程序中运行多个线程本身不会导致问题&#xff0c;问题在于多个线程访问了相同的资源。如&#xff0c;同一内存区&#xff08;变量&#xff0c;数组&#xff0c;或对象&#xff09;、系统&#xff08;数据库&#xff0c;web services等&#xff09;或文件。实际上&#xf…

java 实现打印条形码_条码打印软件中如何设置条形码下面的字符间距?

条形码有两部分组成&#xff0c;上面是黑白条图案&#xff0c;用于扫描设备的识别&#xff0c;下面是条形码数据&#xff0c;方便在没有扫描设备的情况下可以手动去搜索相关的信息。一般用条码打印软件制作条形码&#xff0c;下面的条形码数据间距是自动生成的&#xff0c;而在…