一本通题解——1433 愤怒的牛

article/2025/9/28 15:00:19

题目链接

一本通: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 头牛。根据组合数学,我们知道一共有 \small \binom{3}{5} = \binom{2}{5} = \frac{5*4}{2}=10  种方法,我们用穷举方法,将所有的放置方法写出来,如下:

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 (牛的数量)层循环。从题目的数据范围可以知道,\small C=N=100,000。那么计算的次数就是 \small 100000^{C} ,肯定是一个 TLE (超时)的结局。

二分

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

这样的我们知道算法的时间复杂度为 \small O(logN) 。从题目的数据范围可以知道,\small N=100,000,那么最是 \small log_2(100000)=\frac{log100000}{log2}=16.6,也就是最多 17 次就可以完成。

数学要求

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

坑点

模板题,没有什么坑。即使是二分查找的中间值(mid)计算这个坑,由于  \small 0\leqslant X_{i} \leqslant 100,000,这个坑点也不会出现。

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;
}

 


http://chatgpt.dhexx.cn/article/Ea4yWgYr.shtml

相关文章

大牛给计算机专业学生的 7 个建议

老羊快跑&#xff0c;一个安静低调的公众号&#xff0c;我们关注教育、科技和互联网。 Joel Spolsky的双重身份&#xff08;昔日耶鲁大学计算机系学长&#xff0c;今日Fog Creek软件公司的CEO&#xff09;&#xff0c;所以听听他的建议&#xff0c;对于当今无数困扰于就业压力…

【python】模拟斗牛纸牌游戏「牛牛」

相信大家都玩过或者看别人玩过一个纸牌游戏斗牛,或者也叫牛牛的吧,我们进行就来使用python来实现一下简单的模仿. 请你写一个模拟纸牌斗牛(或者也叫做牛牛)的程序&#xff0c;用以模拟纸牌的生成&#xff0c;洗牌&#xff0c;发牌&#xff0c;点数计算&#xff0c;牌的显示等过…

牛客网刷题篇

作者&#xff1a;敲代码の流川枫 博客主页&#xff1a;流川枫的博客 专栏&#xff1a;C语言从入门到进阶 语录&#xff1a;Stay hungry stay foolish 工欲善其事必先利其器&#xff0c;给大家介绍一款超牛的斩获大厂offer利器——牛客网 点击免费注册和我一起刷题吧 文章目录 …

牛拉法潮流计算 matlab,牛拉法潮流计算原理

基于配电网络特有的层次结构特性,论文提出了一种新颖的分层前推回代算法。该算法将网络支路按层次进行分类,并分层并行计算各层次的支路功率损耗和电压损耗,因而可大幅度提高配电网潮流的计算速度。论文在MATLAB环境下,利用其快速的复数矩阵运算功能,实现了文中所提的分层…

Java实现牛牛算法详解

看过我前面博文的朋友都知道&#xff0c;以前我从事过游戏服务器的开发&#xff0c;但是当时用的是PHP开发的&#xff0c;现在转型Java闲来无事&#xff0c;梳理了一些以前的算法进行详细分析。 定义牌的数据结构&#xff1a; /*** 牌对象* author libing* */ public class …

本地生成七牛token

由于某些原因 有时候需要本地生成token 原文 地址http://zeeyang.com/2016/06/13/Qiniu-token/?utm_sourcetuicool&utm_mediumreferral 这是代码地址:provide simple interface to create token,upload file and upload files 首先我们需要用到三个参数 scope 、 Access…

手工集成7牛SDK到YII2框架中

手工集成7牛SDK到YII2框架中 7牛地址&#xff1a;qiniu.com 7牛云的产品列表中有&#xff1a;对象存储、自定义数据处理、多媒体处理、融合CDN加速、直播空间等资源。 我们上传图片文件需要的是『对象存储』&#xff0c;关于新建存储空间&#xff0c;这里就不多解释。 http…

7 牛 上传图片

官方文档 https://developer.qiniu.com/kodo/sdk/1283/javascript#2 一开始用了里面的 例子 var observable qiniu.upload(file, key, token, putExtra, config) var subscription observable.subscribe(observer) // 上传开始 // or var subscription observable.subscr…

Android使用7牛云存储

第一次使用这个云存储&#xff0c;话说7牛云存储大有来头&#xff01;区别于国内外其他云存储&#xff0c;七牛自行研发的全分布式架构解决了其他云存储单一数据中心架构可能存在的风险&#xff0c;同时首创双向加速特性对数据上传下载均加速&#xff0c;使得数据访问速度较传统…

七牛云解决缓存导致的无法及时更新问题

七牛云在后台配置有两个和缓存相关的配置&#xff0c;一个是maxAge值--客户端缓存&#xff0c;一个是cdn缓存 maxAge值和CDN缓存时间的区别&#xff1f; 访问资源链接时&#xff0c;缓存通常分为浏览器缓存和CDN节点缓存。 用户在浏览器中输入资源链接访问时&#xff0c;优先…

工作用哪个邮箱好用?好用的办公邮箱让你放假无烦恼

小伙伴们&#xff0c;已经初五了&#xff0c;这个春节&#xff0c;你有没有被“办公不便”的甜蜜困惑所打扰呢&#xff1f;如果你有这样的困惑&#xff0c;下面以TOMVIP邮箱为例&#xff0c;来了解一下高效办公的小技巧吧&#xff0c;不错过每一个重要邮件&#xff0c;更高质量…

个人工作邮箱怎么申请?工作邮箱有哪些?

关于工作邮箱有哪些品牌&#xff0c;为此以笔者多年的办公经验分享给大家&#xff0c;个人工作邮箱的申请方式其实很简单&#xff0c;今天小编重点分享一下邮箱品牌的选择。 如何选择邮箱 目前市面上几家主流品牌的邮箱我基本都用过。像搜狐、新浪、tom、163的。注册流程都很…

外贸客户邮箱用什么?外贸哪个邮箱好?

许多人在做外贸业务时&#xff0c;可能会遇到被客户拒绝&#xff0c;其实&#xff0c;这不一定是自己业务水平不够&#xff0c;也许是自己的邮箱账号拖累了自己。有的人喜欢用私人邮箱做外贸业务&#xff0c;但是大部分的外贸商家&#xff0c;都觉得私人邮箱是不够正式的。试想…

iPhone添加教育邮箱

iPhone添加教育邮箱 测试环境&#xff1a;iPhone7&#xff1b;iOS11.4.1 当我们申请了一个教育邮箱后&#xff0c;又希望把该邮箱添加到iPhone上&#xff0c;本贴就手把手一步一步教大家完成。 步骤1&#xff1a; 打开手机主屏幕上的设置&#xff0c;往下滑动&#xff0c;找…

企业邮箱注册购买优惠有哪些,企业工作邮箱怎么注册购买?

企业邮箱作为主流的办公工具&#xff0c;一直是企业和公司使用的首选对象&#xff0c;如果没有用过邮箱&#xff0c;并不知道企业邮箱注册购买的流程是什么样的&#xff0c;以及在与商家沟通上面&#xff0c;能争取到哪些优惠&#xff0c;下面的内容教大家怎样注册购买TOM企业邮…

教你快速记住公司工作邮箱格式,再也不用百度“邮箱格式怎么写”啦!

刚步入职场时&#xff0c;经常会遇到一个问题&#xff0c;那就是在发送邮件时&#xff0c;总记不住其他同事的邮箱&#xff0c;邮件地址错误导致发不出去邮件&#xff0c;今天就来带认识一下如何注册到好记邮箱格式&#xff01; 邮箱账号格式组成&#xff1a; 如上图邮箱账号…

工作电子邮箱怎么注册,电子邮箱格式怎么写?

在工作中&#xff0c;经常会有需要使用电子邮箱的情况&#xff0c;但私人邮箱不方便在日常工作中使用。所以&#xff0c;注册一个工作专用的电子邮箱很有必要&#xff0c;有哪些邮箱适合作为工作电子邮箱呢&#xff1f;TomVIP邮箱就很不错&#xff0c;不仅注册方便&#xff0c;…

工作一般预留什么邮箱? 注册工作邮箱谨防几大雷区!

事实上,关于邮箱的使用价值以及如何能选好并用好它,已成为了众多职场人的困惑。邮箱作为正式且私密性的办公工具,一旦选择通常便不会随意更换。所以无论是初入职场还是想二次选择邮箱的你,注册工作邮箱时一定要掌握选择的真理~ 工作一般预留什么邮箱?对于商务型邮箱选择…

如何申请企业域名工作邮箱?注册企业域名邮箱多少钱?

企业邮箱是员工之间信息共享和高效办公的重要工具&#xff0c;邮件快速收发、安全性成了用户关注的因素。但是TOM企业邮箱的注册区别于普通邮箱&#xff0c;注册方式不一样&#xff0c;让许多企业在申请邮箱时&#xff0c;遇到了很多难题&#xff0c;往往注册不成功或者需要浪费…