描述
农夫 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. php修改数据库字段内容,php对数据库的增删改查操作
  2. operator() error
  3. 初次体验.net Ajax无刷新技术
  4. 华为HG255D救砖小总结1----概述及相关硬件准备
  5. Java之Maven配置教程
  6. pycharm汉化(搜索不到插件的参考第二中方法)
  7. 2011美剧季终/剧终时间表。
  8. 逆向PPTV视频真实播放地址全过程(Java版)
  9. 去掉选中div后出现的高亮淡蓝色边框
  10. kettle启动 carte
  11. RepMet: Representative-based metric learning for classification and few-shot object detection
  12. 【转贴】关于开发数学软件的想法
  13. Tp5 实现短信发送及页面倒计时
  14. 绩效管理市场井喷,企业软件创业迎F-One时刻
  15. WP系统一次订阅,终身锁屏同时显示农历和天气
  16. 【iMessage苹果相册推信息推】 Apple DeviceToken生成的装备上的多个利用程序。 public void subscribe(int clientId, Looper looper
  17. 王慧文清华产品课(七)
  18. 《酒店管理系统》项目总结
  19. VMware 安装Linux centOS 8
  20. 树莓派驱动双目摄像头

热门文章

  1. 颜色恒常性评价指标——角度误差【弧度角度】避坑
  2. 短信通知-阿里大鱼 申请AK 发送Until
  3. 使用Python进行交易策略和投资组合分析
  4. GAN生成对抗网络综述
  5. 英语基础知识:非谓语使用规则上篇
  6. sql根据出生日期计算当前年龄 函数TIMESTAMPDIFF()
  7. 细数网易云音乐上那些适合开车时听的歌单。
  8. Html5播放器如何实现倍速播放
  9. 2020-09-25
  10. java网课|匿名对象Random对象数组