HYSBZ 1734 二分
传送门
题面:
农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000). 但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢 ?
Input
* Line 1: Two space-separated integers: N and C * Lines 2..N+1: Line i+1 contains an integer stall location, xi
第一行:空格分隔的两个整数N和C
第二行---第N+1行:i+1行指出了xi的位置
Output
* Line 1: One integer: the largest minimum distance
第一行:一个整数,最大的最小值
Sample Input
5 3
1
2
8
4
9
题面描述
给出小隔间的编号(位置),然后把牛按一定的方法放进小隔间,要求任意两头牛之间的距离中,最小的那个距离相比于其他把牛放进隔间的方法的最小距离比较,是最大的。
题目分析
这里难就难在理解题意,就拿题目中的样例来说吧:有5个隔间,三头牛,给出了5个隔间的位置,就是:
现在要把三头牛放到这些隔间里面,怎样放才能是符合题意的答案呢?首先我们可以尝试把牛放到1,2,4号隔间,这时任意两头牛的最小距离是1,即任意选两头牛,它们的距离肯定是大于等于1的,这个1就称为任意两头牛的最小距离。我们尝试第二种方法:把牛放到2,4,8号隔间,这时任意两头牛的最小距离是2,2比刚刚的最小距离为1要大,所以舍弃1这个答案。我们再想一想,还有没有比2还要大的摆法?当然有(这不是废话嘛,题目都说答案是3了 )。我们可以尝试把牛放进1,4,8号隔间,这时最小距离是不是3?这个距离3比2和1都要大,而且我们也找不到最小距离比3还要大的摆法了,所以,这个最大的任意两头牛之间的最小距离为3。
那么,现在理解题意之后,有人会问,这跟二分有什么关系?这道题如何运用二分的思想?我们再看回题目:题目中告诉了我们两个隔间最小距离为1,最大距离为1,000,000,000。如果我们从大到小去一个一个验证是否可行,那肯定会超时,所以我们要用到二分的思想来减少运算时间。现在问题转化为如何用二分去解决这道题。我们回顾一下二分的主要代码:
while(r > l){
guess = (r+l)/2;
if(guess < res) l = guess+1;
else r = guess;
}
其中:guess < res
是我们更新依据,如果猜的数比结果小,更新左端点,否则更新右端点。这道题也是类似,重点就在这个判断依据上面。假如我们已经写了一个交check()的函数,这个函数可以验证你猜的距离guess
是否成立(也就是按照你的最小距离放置,奶牛是可以全部放进隔间的),如果成立,就说明答案肯定是大于等于guess
的,为什么呢?因为如果答案小于guess
,而我当距离为guess
时也成立,那么这个最大距离就不是答案,而是guess
。所以凡是小于guess
的距离都不用去考虑。即:
if(check(guess)) l = guess;
如果guess
这个距离不成立的话,那么答案肯定比guess
小,因为以guess
为最小距离都不能把所有的牛放到隔间,更大的距离当然更加不行。所以拼凑起来就是:
if(check(guess)) l = guess;
else r = guess-1;
很显然,这是个左闭右开的区间,所以记得guess
要向上取整。
最后把check()
函数搞定就行了。AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e6 + 5;
long long a[maxn];
int n, c;
bool check(int m){
int cnt = c;
cnt--;
int t = 0;
for(int i = 1; i < n; i++){
if(a[i]-a[t] >= m){
cnt--;
t = i;
}
}
return cnt <= 0;
}
int main(){
cin >> n >> c;
for(int i = 0; i < n; i++) cin >> a[i];
sort(a, a+n);
int l, r;
l = 1;
r = 1e9;
int guess;
while(r > l){
guess = (l+r+1)/2;
if(check(guess)) l = guess;
else r = guess-1;
}
cout << l << endl;
return 0;
}
HYSBZ 1734 二分的更多相关文章
- BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )
最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #inc ...
- bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛【二分+贪心】
二分答案,贪心判定 #include<iostream> #include<cstdio> #include<algorithm> using namespace ...
- 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛
1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 217 Solved: ...
- CQD(陈丹琦)分治 & 整体二分——专题小结
整体二分和CDQ分治 有一些问题很多时间都坑在斜率和凸壳上了么--感觉斜率和凸壳各种搞不懂-- 整体二分 整体二分的资料好像不是很多,我在网上找到了一篇不错的资料: 整体二分是个很神的东西 ...
- bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛
1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Description Farmer John has built a new long barn, with N ...
- 算法笔记--CDQ分治 && 整体二分
参考:https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 前置技能:树 ...
- 完全平方数 HYSBZ - 2440 (莫比乌斯函数容斥)
完全平方数 HYSBZ - 2440 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他 ...
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3352 Solved: 919[Submit][Stat ...
随机推荐
- 爬虫入门三 scrapy
title: 爬虫入门三 scrapy date: 2020-03-14 14:49:00 categories: python tags: crawler scrapy框架入门 1 scrapy简介 ...
- 2018ACM上海大都会赛 F Color it【基础的扫描线】
题目:戳这里 题意:有n*m个点全为白色,q个圆,将q个圆内所有的点都染成黑色,问最后剩下多少白色的点. 解题思路:每一行当做一个扫描线,扫描所有的圆,记录每一行在圆中的点即可,O(n*q). 附ac ...
- 深入剖析JavaScript中的对象与原始值之间的转换机制
我们都知道原始值之间是可以互相转换的,但是如果对象转原始值呢? 所有的对象在布尔上下文(context)中均为 true .所以对于对象,不存在 to-boolean 转换, 只有字符串和数值转换. ...
- GreenSock & SVG Animation
GreenSock & SVG Animation refs https://greensock.com/ https://greensock.com/learning/ GSAP https ...
- holy shit CSDN
holy shit CSDN 垃圾 CSDN 到处都是垃圾文章, 无人子弟 到处都是垃圾广告,看的恶心 毫无底线,窃取别人的知识成果,毫无版权意识 垃圾爬虫,垃圾小号 ...等等 Google Sea ...
- ng 基础
文档 组件的工作只管用户体验,而不用顾及其它. 它应该提供用于数据绑定的属性和方法,以便作为视图和应用逻辑的中介者 组件应该把诸如从服务器获取数据.验证用户输入或直接往控制台中写日志等工作委托给各种服 ...
- Flutter: 判断是Android还是Ios
/// 在ui中使用下面的这个判断 Theme.of(context).platform == TargetPlatform.android /// 而不是 import 'dart:io' Plat ...
- django学习-20.python3中的特殊方法【__str__】的作用
目录结构 1.前言 2.[__str__]特殊方法的具体使用 2.1.当使用print打印一个类被实例化后生成的对象的时候,若类里有定义了[__str__]特殊方法,是打印出这样的数据:[__str_ ...
- scala:函数作为值或参数进行传递、作为返回值进行返回
@ 目录 函数可以作为值进行传递 函数可以作为参数进行传递 函数可以作为返回值进行返回 什么是匿名函数 函数可以作为值进行传递 语法var f = 函数名 _ 如果明确了变量的数据类型,那么下划线可以 ...
- linux 安装node和pm2
用yum安装 curl -sL https://rpm.nodesource.com/setup_10.x | bash - yum install -y nodejs npm install -g ...