nyoj 586 疯牛(二分+贪心)

疯牛

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
农夫 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个带有编号的隔间里,使得任意两头牛所在的隔间编号的最小差值最大。例如样例排完序后变成1 2 4 8 9,那么1位置放一头牛,4位置放一头牛,它们的差值为3;最后一头牛放在8或9位置都可以,和4位置的差值分别为4、5,和1位置的差值分别为7和8,不比3小,所以最大的最小值为3。

分析:这是一个最小值最大化的问题。先对隔间编号从小到大排序,则最大距离不会超过两端的两头牛之间的差值,最小值为0。所以我们可以通过二分枚举最小值来求。假设当前的最小值为x,如果判断出最小差值为x时可以放下C头牛,就先让x变大再判断;如果放不下,说明当前的x太大了,就先让x变小然后再进行判断。直到求出一个最大的x就是最终的答案。


cpp:

#include <stdio.h>
#include <stdlib.h>
#define Max_size 100020
int x[Max_size];
int N,C;
int com(const void *a,const void *b)//排序 
{return *(int *)a-*(int *)b;
}
bool Judge(int v)
{//v表示两牛之间最小的距离值int i;int num=0;//房子编号int t;for(i=1;i<C;i++)//对牛计数{t=num+1;while(t<N&&x[t]-x[num]<v)//t跳出时 t==N说明列举了 num之后的所有房子都无法满足两房子之间距离<=v值t++;//反之,则说明找到了满足条件的房子if(t==N)return false;num=t;}return true;
}
int main()
{int i;int bottom,top;int mid;while(~scanf("%d%d",&N,&C)){for(i=0;i<N;i++)scanf("%d",x+i);qsort(x,N,sizeof(x[0]),com);//因为每个房间的坐标是混乱的,所以对每个房间的坐标进行小到大排序bottom=0;top=(x[N-1]-x[0])*2;//确定上界和下界while(top-bottom>1){mid=(top+bottom)/2;if(Judge(mid))bottom=mid;//mid值能满足条件 说明答案的区间为[mid,top)else top=mid;//mid 值不能满足条件 说明答案的区间为(bottom,mid)}printf("%d\n",bottom);}return 0;
}        

#include<stdio.h>
#include <stdlib.h>
int cmp(const void*a,const void *b)
{return *(int *)a-*(int *)b;
}
int a[1000001];
int main()
{int i,c,h,sum;while(scanf("%d%d",&h,&c)!=EOF){for(i=0;i<h;i++)scanf("%d",&a[i]);qsort(a,h,sizeof(a[0]),cmp);int max=a[h-1]-a[0];//二分搜索的范围,这里Max是两头牛相距的最大范围 int min=0,mid;while(max>=min){mid=(min+max)/2;//截取中间的这个点 int m=1,n=0;sum=0;while(m<h){if(a[m]-a[n]>=mid)//领M个元素与第N个元素比较,如果大于这个等于Mid,说明这个距离可以放牛, {                 // 然后把N的值改变,n=m,让下一个m++元素与这个n比较, sum++;        //同时记录符合这个距离的情况有几种,sum++; n=m;}m++;}if(sum>=c-1)//如果这种情况是大于c-1头牛的,说明答案在 【mid+1,max】中 {min=mid+1;}else //如果这种情况是小于c-1头牛的,说明答案在 【min,mid-1】中 {max=mid-1;}}printf("%d\n",min-1); }return 0;
}




这个是贪心和二分.二分查找又是折半查找,首先,元素是升序排列,每次查找中间元素和待查找元素进行比较,如果相同,就返回中间元素的位置值,如果不相同且中间元素大于待查找元素就从右边开始,如果不相同且中间元素小于待查找元素就从左边开始,适用于不经常变动而且查找频繁的有序列表。

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

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

相关文章

es6--解构赋值

1&#xff1a; 基本用法 let [a,b,c] [1,2,3] 总结&#xff1a;只要等号两边都是可循环的结构&#xff0c;等号右边的就会按照相应的位置把值赋给左边 2&#xff1a;高级用法 let [x,y 1] [1,2] 1) 变量可以有默认值 let [x,y 1] [1,2] 2&#xff09;当且仅当等号右边的…

Type-C PD充电简介

一、Type-C简介自1998年以来&#xff0c;USB发布至今&#xff0c;USB已经走过20个年头有余了。在这20年间&#xff0c;USB-IF组织发布N种接口状态&#xff0c;包括A口、B口、MINI-A、MINI-B、Micro-A、Micro-B等等接口形态&#xff0c;由于各家产品不同&#xff0c;不同产品使用…

Linux字符设备驱动内幕

哈喽&#xff0c;我是老吴&#xff0c;继续记录我的学习心得。一、保持专注的几个技巧将最重要的事放在早上做。待在无干扰环境下&#xff0c;比如图书馆。意识到刚坐下开始投入工作前&#xff0c;有点负面小情绪是特别正常的现象。让“开心一刻”成为计划的一部分。拥有合情合…

线性表的顺序存储

线性表是n个类型相同数据元素的有限序列&#xff0c;对n>0,除第一个元素无直接前驱&#xff0c;最后一个元素没有直接后继外&#xff0c;其他都是每个元素有一个直接前驱和直接后继&#xff0c;而且是一对一的关系。 线性表&#xff1a;顺序存储&#xff0c;链式存储。 &…

mysql 5.6.38 数据库编译安装

一、系统环境&#xff1a; # cat /etc/redhat-release CentOS release 6.9 (Final)二、mysql 编译安装&#xff1a; 1、安装依赖包&#xff1a; yum install -y ncurses-devel libaio-devel cmake2、创建mysql管理用户&#xff1a; useradd -s /sbin/nologin -M mysql id m…

旧地重游

光阴飞逝1991年跟随父母搬迁至长沙&#xff0c;至今已有16年。2007年春节舅妈大寿借此机会回到儿时旧地以了多年来的心愿。经过1个小时左右颠簸终于快回到儿时生长的地方&#xff0c;那里的路面年久失修&#xff0c;经过昨天的大雨&#xff0c;已经坑坑洼洼路面到处积水&#x…

我要不要离职?

1#读者提问来到四线城市的小公司&#xff0c;其他员工都是公司主动找到他们转正的&#xff0c;有的一个月有的三个月&#xff0c;而我半年过去了&#xff0c;以为时间到了也跟他们一样自动帮我转正。然而没有&#xff0c;昨天忍不住问了公司&#xff0c;今天就拿转正表来给我填…

单链表的应用 就地逆置

【问题描述】试实现线性表的就地逆置算法&#xff0c;即在原表的存储空间将线性表&#xff08;a1,a2,a3....an&#xff09;逆置为&#xff08;an...a3,a2,a1&#xff09;. [分析]就地逆置就是不需要额外申请结点空间&#xff0c;只需要利用原来的表中的结点空间。若对顺序表中的…

关于arguments的用法

当函数的参数个数无法确定的时候&#xff1a;用 arguments。函数的 arguments 对象并不是一个数组&#xff0c;它相当于是一个实参的集合&#xff0c;但是访问单个参数的方式与访问数组元素的方式相同。访问 函数中的第n个参数 则可以使用arguments[n-1]。 1、arguments实际为实…

搞懂进程组、会话、控制终端关系,才能明白守护进程干嘛的?

守护进程概念&#xff1a;守护进程&#xff0c;也就是通常所说的Daemon进程&#xff0c;是Linux中的后台服务进程。周期性的执行某种任务或等待处理某些发生的事件。Linux系统有很多守护进程&#xff0c;大多数服务都是用守护进程实现的。比如&#xff1a;像我们的tftp&#xf…

关于编译C#文件

使用csc.exe编译非控制台应用程序,常使用/target选项此选项可简写为/t,用来指定要创建的文件类型. 如编译一个类库文件(dll)Class1.cs: namespaceTest...{ /**//// <summary> /// Class1 的摘要说明。 /// </summary> public class Class1 ...{ …

中缀表达式转换为前缀及后缀表达式并求值【摘】

它们都是对表达式的记法&#xff0c;因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同&#xff1a;前缀表达式的运算符位于与其相关的操作数之前&#xff1b;中缀和后缀同理。举例&#xff1a;(3 4) 5 - 6 就是中缀表达式- 3 4 …

H5-geolocation学习

geolocation——定位PC——IP地址精度比较低IP库Chrome -> Google手机——GPSwindow.navigator.geolocation单次 getCurrentPosition(成功, 失败, 参数)enableHighAccuracy 高精度模式——更慢、更费电timeout 超时maximumAge 缓存时间…

【速来抢】iPhone12、STM32开发板、1024元现金红包…打包免费送!!!

没错&#xff01;华清远见在做1024狂欢节活动今年他们“玩”的有点大参与活动&#xff0c;抽取幸运锦鲤下面21件惊喜大礼&#xff0c;打包全部带回家????参与方式&#xff1a;扫码下方二维码&#xff0c;进活动群获取抽奖链接&#xff0c;参与抽奖????福利2除了万元锦鲤…

什么才是成熟

成熟就是你能控制你自己&#xff0c;知道自己想要什么&#xff0c;并能自如的朝着这个方向走&#xff0c;是你能控制自己的喜怒哀乐&#xff0c;而不是要别人左右你&#xff0c;他的表现应该是这样的 &#xff08;文摘&#xff01;&#xff09; 1.现实态度 一个心理健全的成年人…

1024,第 15 届「中国内核开发者大会」 参会指南(议程全剧透)

各位好&#xff0c;第 15 届「中国内核开发者大会」即将开幕&#xff0c;这些参会指南请提前收藏好&#xff1a;2020「中国内核开发者大会」&#xff08;以下简称 CLK&#xff09;将在 2020 年 10 月 24 日举办&#xff0c;线上线下同步进行&#xff0c;线上由 CSDN 进行全网直…

C语言中的转义字符【转ce123的技术博客】

C语言中的转义字符 简介 在字符集中&#xff0c;有一类字符具有这样的特性&#xff1a;当从键盘上输入这个字符时&#xff0c;显示器上就可以显示这个字符&#xff0c;即输入什么就显示什么。这类字符称为可显示字符&#xff0c;如a、b、c、$、和空格符等都是可显示字符。 另一…

Tomcat配置和Web应用程序开发

引自友人blog: [url]http://blog.csdn.net/senton[/url]◆tomcat是一个专门用于web服务的服务器软件.1&#xff0e;运行 &#xff1a;设置完毕后就可以运行tomcat服务器了&#xff0c;进入tomcat的bin目录&#xff0c;windows下用startup启动tomcat&#xff0c;相应的关闭tomca…

centos关闭防火墙

centos6.5 查看防火墙状态 &#xff1a; service iptable status 临时关闭防火墙 &#xff1a; servcie iptables stop 永久关闭防火墙 &#xff1a;chkconfig iptables off centos7 停止firewall&#xff1a; systemctl stop firewalld.service …

1024对话内核大神谢宝友

我看了CSDN的采访&#xff0c;感觉比较官方&#xff0c;不知道是不是编辑的原因把一些内容给隐藏了&#xff0c;所以我还是想完整的内容放出来给大家看看&#xff0c;这些问题&#xff0c;可能是很多后辈程序员非常关心的。今天是1024节&#xff0c;这个数字对于写在电脑前写代…