题目链接

一本通:http://ybt.ssoier.cn:8088/problem_show.php?pid=1433。

自己OJ:http://47.110.135.197/problem.php?id=4458。

题目

题目描述

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

输入

第一行:空格分隔的两个整数 N 和 C ;
第二行---第N+1行: i + 1 行指出了 xi 的位置。
Line 1: Two space-separated integers: N and C
Lines 2..N+1: Line i+1 contains an integer stall location, xi

输出

一个整数,最大的最小值。
Line 1: One integer: the largest minimum distance

样例输入

5 3
1 2 8 4 9

样例输出

3

提示

把牛放在 1,4,8 这样最小距离是 3 。

题目分析

本题原题来自USACO 2005 Feb. Gold。一个二分查找的模板题。

题目分析

从题目可以知道。题目提供了现在有的牛栏编号 Xi 和牛的数量 C,由于牛比较好斗,如果两个牛放在同一个牛栏里,牛就会互相伤害。要求我们将牛放好(不会互相伤害),而且两头牛之间的最小距离最大。

这样我们可分析出如下内容:

1、要求两头牛之间的最小距离最大,而且题目没有告诉我们牛栏的编号 Xi 是有序的,所以肯定要先排序。

2、排序后,我们开始尝试放置 C 头牛,放置好了,求出最小距离,然后求最大值。8*7/2

这样问题就变成如何放置牛,并求出牛之间的最小距离,将所有方案进行比较即可。如何求呢?我们使用样例数据来模拟,排序好的牛栏 Xi 如下:

1 2 4 8 9

我们一共有 C 头牛,也就是 3 头牛。根据组合数学,我们知道一共有   种方法,我们用穷举方法,将所有的放置方法写出来,如下:

1、第 1 种方案,也就是将 3 头牛,分别放置在 1、2、4 这三个牛栏。那么牛的最小距离是 2 - 1 = 1 。

2、第 2 种方案,也就是将 3 头牛,分别放置在 1、2、8 这三个牛栏。那么牛的最小距离是 2 - 1 = 1 。

3、第 3 种方案,也就是将 3 头牛,分别放置在 1、2、9 这三个牛栏。那么牛的最小距离是 2 - 1 = 1 。

4、第 4 种方案,也就是将 3 头牛,分别放置在 1、4、8 这三个牛栏。那么牛的最小距离是 4 - 1 = 3 。

5、第 5 种方案,也就是将 3 头牛,分别放置在 1、4、9 这三个牛栏。那么牛的最小距离是 4 - 1 = 3 。

6、第 6 种方案,也就是将 3 头牛,分别放置在 1、8、9 这三个牛栏。那么牛的最小距离是 9 - 8 = 1 。

7、第 7 种方案,也就是将 3 头牛,分别放置在 2、4、8 这三个牛栏。那么牛的最小距离是 4 - 2 = 2 。

8、第 8 种方案,也就是将 3 头牛,分别放置在 2、4、9 这三个牛栏。那么牛的最小距离是 4 - 2 = 2 。

9、第 9 种方案,也就是将 3 头牛,分别放置在 2、8、9 这三个牛栏。那么牛的最小距离是 9 - 8 = 1 。

10、第 10 种方案,也就是将 3 头牛,分别放置在 4、8、9 这三个牛栏。那么牛的最小距离是 9 - 8 = 1 。

可以知道,两头牛之间最小距离的最大值为 3 。

算法思路

暴力

如同上面的数据分析,就是列出所有组合,就是一个 C (牛的数量)层循环。从题目的数据范围可以知道,。那么计算的次数就是  ,肯定是一个 TLE (超时)的结局。

二分

这样我们可以知道,就是一个标准的二分查找。查找的左边界(left)为 0 (两头牛放在一起),右边界(right)为 8 (9-1),假设中间值(mid)作为两头牛最小间隔的最大值,按照这个方案去分配牛,如果满足条件(就是这个方案可以放 C 头牛),我们缩小查找距离。直到查找结束,这个时候,右边界(right)就是所求的最下距离的最大值。

这样的我们知道算法的时间复杂度为 。从题目的数据范围可以知道,,那么最是 ,也就是最多 17 次就可以完成。

数学要求

从上面分析,我们可以知道,要求了解组合数学。

坑点

模板题,没有什么坑。即使是二分查找的中间值(mid)计算这个坑,由于  ,这个坑点也不会出现。

AC参考代码

#include <bits/stdc++.h>
using namespace std;const int MAXN = 1e5;
int data[MAXN] = {};int main(){int n, c;cin >> n >> c;int i;for (i=0; i<n; i++) {cin >> data[i];}//排序sort(data, data+n);//二分int left = 0;int right = data[n-1]-data[0];int mid;while (left<=right) {mid = left+(right-left)/2;//间隔mid的距离放置牛,进行合法性检查int cows = 1;//可以放几头牛int prev = data[0];//上一个牛所在的栏for (i=1; i<n; i++) {if (data[i]-prev>=mid) {//符合要求,放一头牛cows++;prev = data[i];//牛数量够了,降低计算量if (cows>=c) {break;}}}if (cows >= c) {left = mid+1;} else {right = mid-1;}}cout << right << endl;return 0;
}

一本通题解——1433 愤怒的牛相关推荐

  1. 1433:【例题1】愤怒的牛

    1433:[例题1]愤怒的牛 题解 This is an er'fen ti. 由题意可得  它是求最小值最大的问题 我们假设: 每两头牛之间的最小距离为 d ,也就是每两头牛之间的距离 >= ...

  2. BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )

    最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #inc ...

  3. 7-2 愤怒的牛 (25分)

    7-2 愤怒的牛 (25分) 农夫约翰建造了一座有n间牛舍的小屋,牛舍排在一条直线上,第i间牛舍在x ​i ​​ 的位置,但是约翰的m头牛对小屋很不满意,因此经常互相攻击.约翰为了防止牛之间互相伤害, ...

  4. 【2020年天梯赛校选赛】7-16 愤怒的牛

    [2020年天梯赛校选赛]7-16 愤怒的牛 农夫约翰建造了一座有n间牛舍的小屋,牛舍排在一条直线上,第i间牛舍在xi​​ 的位置,但是约翰的m头牛对小屋很不满意,因此经常互相攻击.约翰为了防止牛之间 ...

  5. 7-6 愤怒的牛 (25 分)

    7-6 愤怒的牛 (25 分) 农夫约翰建造了一座有n间牛舍的小屋,牛舍排在一条直线上,第i间牛舍在xi​的位置,但是约翰的m头牛对小屋很不满意,因此经常互相攻击.约翰为了防止牛之间互相伤害,因此决定 ...

  6. 信息学奥赛一本通(题解目录)

    信息学奥赛一本通(题解目录) 记录了我从初学者到逐渐熟悉c++的成长之路 信息学奥赛一本通OJ 目录 信息学奥赛一本通(题解目录) 前言 一.语言及算法基础篇 基础(一) C++语言 第一章 C++语 ...

  7. 愤怒的牛(信息学奥赛一本通-T1433)

    [题目描述] 农夫 John 建造了一座很长的畜栏,它包括 N(2≤N≤100,000) 个隔间,这些小隔间依次编号为 x1,...,xN(0≤xi≤1,000,000,000). 但是,John 的 ...

  8. BZOJ1734: [Usaco2005 Feb]Aggressive cows 愤怒的牛

    [传送门:BZOJ1734] 简要题意: 约翰有N 间牛棚,这些牛棚坐落在一条直线上,第i 间牛棚位于坐标Xi 的位置.他要把C 头 奶牛安排在这些牛棚里.每间牛棚最多可以放一头奶牛,也可以空着.这些 ...

  9. 一本通题解——1251:仙岛求药

    题目相关 题目链接 一本通 OJ,http://ybt.ssoier.cn:8088/problem_show.php?pid=1251. 计蒜客 OJ,https://nanti.jisuanke. ...

最新文章

  1. Linux下redis的安装(适用centos)
  2. 技术负责人要停止写代码吗?
  3. [原创]SSH密钥访问Git仓库配置
  4. Android4.2以及最新SDK的尝鲜使用
  5. ios 设置属性的center_ios-坐标系统(详解UIView的frame、bounds跟center属性[图])
  6. JUC锁框架——CyclicBarrier
  7. python打印字节流_Python 调用系统命令的模块 Subprocess
  8. Web前端基础---JavaScript函数事件及其绑定DOM模型BOM模型
  9. 你的目的是什么是谁指使你_零基础是一种回归初心的思考:写作的目的是什么?怎么写?写谁?...
  10. android 不透明度
  11. 数字电路中表示频率误差的ppm是什么意思?
  12. Markdown文件中图片自动转云图片和自动生成标题序号
  13. 新世纪大学英语(第二版)综合教程第一册 Unit 3 (中英翻译和重点单词)
  14. 解决绿C(C与C++程序设计学习与实验系统 2015)软件程序中文出现乱码问题
  15. echarts 横向条形图 对比
  16. 2023年安徽省中职网络安全跨站脚本攻击
  17. linux开启终端窗口快捷键
  18. HBase初识之学生心得总结
  19. 计算机高中竞赛自主招生,自主招生必备常识:高校认可的各类竞赛
  20. 什么叫显示动力学_ANSYS-什么叫显示动力学

热门文章

  1. 微信小程序----动态
  2. Word处理控件Aspose.Words功能演示:使用 Java 将 Word 文档转换为 HTML
  3. JSON里的大括号{}和中括号[]。(关于JSON的结构)
  4. 【娱乐】抽取周易易经单字组合取名
  5. 轮胎与车辆油耗的关系
  6. Elasticsearch7.x安装(ES,kibana,ik分词器)Windows环境下
  7. 如何查看iOS手机证书安装位置
  8. IP、子网掩码、网关
  9. 收件箱和发件箱 表设计_在收件箱中播放不错
  10. macports 2.3.1 安装mysql 报错_使用MacPorts配置PHP开发环境(PHP54+PHP FPM+NGINX+MYSQL55)...