Aggressive cows-疯牛POJ(2456)-详解
描述
农夫 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)-详解相关推荐
- NYOJ 586 疯牛 POJ 2456(二分搜索 + 贪心)
疯牛 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间 ...
- 南阳nyoj586疯牛 和nyoj619详解总结
这里先看nyoj619青蛙过桥,这样便于理解这两道题的共同点:最大值中的最小值, 题意:有一条河长L,中间有 n 块石头,青蛙最多可以跳 m 次,问题是:要保证青蛙能跳过去,那么它至少能一下跳多远,才 ...
- 二分搜索 POJ 2456 Aggressive cows
题目传送门 1 /* 2 二分搜索:搜索安排最近牛的距离不小于d 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #incl ...
- 二分入门——poj 2456 aggressive cows
这是一道二分的神奇贪心题,先上题目 Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11714 A ...
- Popular Cows POJ - 2186(tarjan算法)+详解
题意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有 N头牛,给你M对整数(A,B),表示牛 A认为牛B受欢迎.这种关系是具有传递性的,如果 A认为 B受欢迎, B认为 C受欢迎,那么牛 A也认为牛 ...
- Aggressive cows POJ - 2456
2456 -- Aggressive cows 题目大意:有c只牛,要把他们放在n个屋子里,每个屋子放一只牛,每个屋子都在一根数轴上,给出他们的坐标,要让每个屋子间的最小距离尽可能的大,问这个最大距离 ...
- POJ 2456 Aggressive cows(二分答案)
Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22674 Accepted: 10636 Des ...
- Power Network POJ - 1459(EK算法模板+详解)
题意: 总共有a个节点,其中有发电站b个.用户c个和调度器a-b-c个三种节点,每个发电站有一个最大发电量,每个用户有个最大接受电量,现在有d条有向边,边有一个最大的流量代表,最多可以流出这么多电,现 ...
- 暑期集训3:几何基础 练习题H: POJ - 2456
2018学校暑期集训第三天--几何基础 练习题H -- POJ - 2456 Aggressive cows Farmer John has built a new long barn, wit ...
- 最短路算法详解(Dijkstra/SPFA/Floyd)
转自:http://blog.csdn.net/murmured/article/details/19281031 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短 ...
最新文章
- 结课作业:云计算在物联网中的应用发展
- J2EE常用资源管理方式总结
- csdn个人主页下如何添加微信公众号及超链接
- 设计模式之组合模式(Composite)
- Android源码和内核源码的下载,编译和执行
- 低代码Web应用程序构造方法-ASP.NET Core 2.2单页应用程序(SPA)
- Linux工作笔记029---Centos7.3 服务器下查看tomcat服务是否启动,重启,查看错误日志等基本操作
- 【调试手段】GDB调试
- 快速生成Plugman中的lib-file、source-file的xml内容
- 什么是陀螺仪的dr算法_PID控制器调参工具——DR-PID Tuning(Matlab GUI)
- python 检查域名是否可以访问_糖尿病人是否都要做喝糖水的检查?结果可以说明胰岛功能水平吗?...
- BiLSTM+CRF命名实体识别:达观杯败走记(下篇)
- 小游戏公司该如何应对网络攻击?
- win10开发环境搭建之wsl2(Ubuntu)+Terminal+docker
- Banner轮播图的基本使用
- 如何用python进行相关性分析_Python 数据相关性分析
- 双系统(win10+ubuntu)引导页消失
- 一文了解半导体的过去、现在和未来
- H指数问题(USACO)
- QT 笔记3 | Qt设计师使用 Qt创造器使用