nyoj 586 疯牛(二分+贪心)
疯牛
- 描述
-
农夫 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; }
-
这个是贪心和二分.二分查找又是折半查找,首先,元素是升序排列,每次查找中间元素和待查找元素进行比较,如果相同,就返回中间元素的位置值,如果不相同且中间元素大于待查找元素就从右边开始,如果不相同且中间元素小于待查找元素就从左边开始,适用于不经常变动而且查找频繁的有序列表。
nyoj 586 疯牛(二分+贪心)相关推荐
- NYOJ 586 疯牛
疯牛 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间 ...
- NYOJ 586 疯牛 POJ 2456(二分搜索 + 贪心)
疯牛 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间 ...
- 《贪心算法》— NYOJ 586 疯牛
疯牛 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间 ...
- POJ 2456 疯牛(二分+贪心)
疯牛 时间限制: 1000 ms | 内存限制: 65535 KB 难度: 4 描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些 ...
- 蒟蒻的第一篇博客CF1041C Coffee Break(二分+贪心+set)
CF1041C Coffee Break(二分+贪心+set) 描述 Recently Monocarp got a job. His working day lasts exactly mm min ...
- 洛谷P1182 数列分段 Section II(二分+贪心)
题目描述 对于给定的一个长度为N的正整数数列 A1∼NA _{1∼N}A1∼N,现要将其分成 M(M≤N)M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一 ...
- nyoj 680 摘枇杷(二分+贪心)
摘枇杷 时间限制: 2000 ms | 内存限制: 65535 KB 难度: 3 描述 理工学院的枇杷快熟了,ok,大家都懂得.而且大家都知道,学校的枇杷树都是一列一列的.现在小Y同学已经在筹划怎 ...
- [USACO16JAN]Angry Cows S[二分+贪心]
题意:Bessie 设计了一款新游戏:Angry Cows.在这个游戏中,玩家发射奶牛,每头奶牛落地时引爆一定范围内的干草.游戏的目标是使用一组奶牛引爆所有干草. N 捆干草排列在数轴上的不同位置.第 ...
- BZOJ2525 [Poi2011]Dynamite 【二分 + 贪心】
题目链接 BZOJ2525 题解 就是要求所有有炸弹的点到点燃点距离最大值最小 显然二分答案距离\(D\) 然后按深度排序,贪心点燃当前没覆盖的深度最深的点往上第\(D\)层的点 每覆盖一个点要标记其 ...
最新文章
- 强大的德国教育如何锻造孩子的健全人格
- VMware Fusion 静态ip
- angular学习的一些小笔记(中)之表单验证
- 微服务架构的核心技术问题
- 第一章节 c#面向对象
- chrome webstore
- Arturia Analog Lab V for Mac - 超强键盘模拟合成器
- 高盛的合伙人是如何选出来的?
- 并查集之Wireless Network(一)
- Oracle OCP和MySQL OCP认证考试内容有哪些?
- 入行GIS圈N年,看看资深GISer如何进行场景绘制?
- Eucalyptus云服务平台
- 宁盾无线认证对接锐捷EG3220
- 【其他系列】走出舒适圈
- 三星android功能怎么用,三星画中画功能是什么意思?三星手机画中画功能使用教程图解...
- 人工智能入门:基于Linux与Python的神经网络
- Android killer 回编译失败
- Scanpy(二)可视化函数
- 第九章openwrt 703N 网口转串口+串口转网口TTL 数据传输
- 【一步一步学习VBA】Excel VBA 读取txt文件并写入Excel单元格
热门文章
- ERP项目需要持续的呵护
- python如何判断给定的日期是周几?
- 网络爬虫--3.str和bytes的区别
- Flask爱家租房--房屋管理(获取房东发布的房源信息条目)
- mysql语法题_mysql数据库题语法练习
- leelen可视对讲怎么接线_楼宇对讲系统怎么布线 楼宇对讲系统布线方式【介绍】...
- pycharm Debug问题
- mysql datetime类型按天查询_mysql 时间相关sql , 按天、月、季度、年等条件进行查询...
- Java笔记01-数组相关
- Device eth0 does not seem to be present,delaying initialization的解决办法