描述
农夫 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 312849样例输出3

解题思路:此题表达的意思是:把 C头牛放进 N个带编号的隔间中,使得任意两头的隔间距离(位置的最小差值)最大。以输入样例为例,将3头牛放进编号为1、4、8的隔间,则这3头牛所在的隔间的距离为3、4、7,最短距离为 3.不可能找到比 3还要大的最小距离。假设任意两头牛的编号差值都大于3,考虑贪心算法,按间隔编号从小到大分配,第一头牛放进编号1的隔间,则第二头牛至少需要放进编号8的隔间,此时,第三头牛只能进入编号9的隔间,而9-8=1<3,与假设矛盾。
这道题是一个最小值最大化的问题。这类问题不易直接求解,可尝试简化问题,将求最小值问题转化为判断性问题:判断最小距离为X时是否可放下C头牛。那么目标就转化为从小到大枚举X,判断是否可行,直到找到第一个可行的X,则这个X就是答案。为了进一步加快算法速度,可使用二分查找替换顺序枚举。
因此,问题现在转化为判定性问题和二分查找
(1)判断问题:使用贪心算法,对隔间的编号从小到大的排序,从最小编号的隔间开始,每次分配距离尽可能近的隔间,看最后能否分配下C头牛
(2)二分查找:最小距离left=0,最大距离right=L[N-1]-L[0]。此时的二分查找是要找到最小满足条件的目标元素,相当于查找重复出现的元素第一次出现的位置。也要注意循环结束的条件和返回值。

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int INF = 9999999;
//输入
int N,M;
int x[100];
//判断是否满足条件
bool C(int d){int last = 0;for(int i=1;i<M;i++){int crt = last + 1;while(crt < N && x[crt] - x[last] < d){crt++;} if(crt == N)return false;last = crt; } return true;
}
void solve(){//最开始时对 x数组排序sort(x,x+N); //初始化解的存在范围int lb = 0;int ub = INF;while(ub - lb > 1){int mid = (lb + ub)/2;if(C(mid)){lb = mid;} else{ub = mid;} } printf("%d\n",lb);
}
int main(){cin>>N>>M;for(int i=0;i<N;i++){cin>>x[i]; } solve();return 0;
} 

有什么不懂可以在评论区问我,我会及时回答的,感谢阅读,希望能帮到您!

Aggressive cows-疯牛POJ(2456)-详解相关推荐

  1. NYOJ 586 疯牛 POJ 2456(二分搜索 + 贪心)

    疯牛 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间 ...

  2. 南阳nyoj586疯牛 和nyoj619详解总结

    这里先看nyoj619青蛙过桥,这样便于理解这两道题的共同点:最大值中的最小值, 题意:有一条河长L,中间有 n 块石头,青蛙最多可以跳 m 次,问题是:要保证青蛙能跳过去,那么它至少能一下跳多远,才 ...

  3. 二分搜索 POJ 2456 Aggressive cows

    题目传送门 1 /* 2 二分搜索:搜索安排最近牛的距离不小于d 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #incl ...

  4. 二分入门——poj 2456 aggressive cows

    这是一道二分的神奇贪心题,先上题目 Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11714 A ...

  5. Popular Cows POJ - 2186(tarjan算法)+详解

    题意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有 N头牛,给你M对整数(A,B),表示牛 A认为牛B受欢迎.这种关系是具有传递性的,如果 A认为 B受欢迎, B认为 C受欢迎,那么牛 A也认为牛 ...

  6. Aggressive cows POJ - 2456

    2456 -- Aggressive cows 题目大意:有c只牛,要把他们放在n个屋子里,每个屋子放一只牛,每个屋子都在一根数轴上,给出他们的坐标,要让每个屋子间的最小距离尽可能的大,问这个最大距离 ...

  7. POJ 2456 Aggressive cows(二分答案)

    Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22674 Accepted: 10636 Des ...

  8. Power Network POJ - 1459(EK算法模板+详解)

    题意: 总共有a个节点,其中有发电站b个.用户c个和调度器a-b-c个三种节点,每个发电站有一个最大发电量,每个用户有个最大接受电量,现在有d条有向边,边有一个最大的流量代表,最多可以流出这么多电,现 ...

  9. 暑期集训3:几何基础 练习题H: POJ - 2456

    2018学校暑期集训第三天--几何基础 练习题H  --   POJ - 2456 Aggressive cows Farmer John has built a new long barn, wit ...

  10. 最短路算法详解(Dijkstra/SPFA/Floyd)

    转自:http://blog.csdn.net/murmured/article/details/19281031 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短 ...

最新文章

  1. 结课作业:云计算在物联网中的应用发展
  2. J2EE常用资源管理方式总结
  3. csdn个人主页下如何添加微信公众号及超链接
  4. 设计模式之组合模式(Composite)
  5. Android源码和内核源码的下载,编译和执行
  6. 低代码Web应用程序构造方法-ASP.NET Core 2.2单页应用程序(SPA)
  7. Linux工作笔记029---Centos7.3 服务器下查看tomcat服务是否启动,重启,查看错误日志等基本操作
  8. 【调试手段】GDB调试
  9. 快速生成Plugman中的lib-file、source-file的xml内容
  10. 什么是陀螺仪的dr算法_PID控制器调参工具——DR-PID Tuning(Matlab GUI)
  11. python 检查域名是否可以访问_糖尿病人是否都要做喝糖水的检查?结果可以说明胰岛功能水平吗?...
  12. BiLSTM+CRF命名实体识别:达观杯败走记(下篇)
  13. 小游戏公司该如何应对网络攻击?
  14. win10开发环境搭建之wsl2(Ubuntu)+Terminal+docker
  15. Banner轮播图的基本使用
  16. 如何用python进行相关性分析_Python 数据相关性分析
  17. 双系统(win10+ubuntu)引导页消失
  18. 一文了解半导体的过去、现在和未来
  19. H指数问题(USACO)
  20. QT 笔记3 | Qt设计师使用 Qt创造器使用

热门文章

  1. DStream转换操作
  2. chipping rate码片速率
  3. 关于后缀表达式的转换
  4. java第三方类库Guava开源组件使用
  5. Tungsten Fabric知识库丨vRouter内部运行探秘
  6. 火焰图(FlameGraph)的使用
  7. 计算机休眠是打不开,电脑自动进入睡眠模式打不开是为什么
  8. hdu 6287 口算训练(二分+质因数分解+思维)
  9. SpringBoot整合Elasticsearch BBoss
  10. C++ 动态开辟空间