POJ 2456 Aggressive cows(二分)
来源:互联网 发布:广东crm软件 编辑:程序博客网 时间:2024/06/05 11:33
题目链接:http://poj.org/problem?id=2456
题目大意:有n个牛栏,m头牛,将牛放入栏中,要使它们的最小距离尽可能大,输出这个最小距离。
二分搜索。
#include<cstdio>#include<iostream>#include<sstream>#include<cstdlib>#include<cstring>#include<string>#include<climits>#include<cmath>#include<algorithm>#include<queue>#include<vector>#include<stack>#include<set>#include<map>using namespace std;const int N=1e5+5;int n,m;int a[N];//栏位置的坐标bool judge(int x){ int sum=1;//放第一头牛 int situ=a[0];//第一头牛一定要放在第一个栏才能充分利用间隔长度 for(int i=1; i<n; i++) if(situ+x<=a[i])//现处的位置加上间隔若小于下个位置的坐标,则可行 { situ=a[i]; sum++; } if(sum>=m)//能放下m头牛 return 1; else return 0;}int main(){ while(~scanf("%d%d",&n,&m)) { for(int i=0; i<n; i++) scanf("%d",&a[i]); sort(a,a+n);//先从小到大进行排序 int l=0x3f3f3f3f; for(int i=1; i<n; i++) l=min(l,a[i]-a[i-1]);//左边界就是所有间隔中的最小值 int r=(a[n-1]-a[0])/(m-1);//因为要输出的结果是最小间隔,因此最大的可能都是当把m个牛放进去后,间隔的平均值 int result; while(l<=r)//典型二分 { int mid=(l+r)/2; if(judge(mid))//若为真,表明这个间隔可以放下所有的牛 { result=mid; l=mid+1;//因为题目要求最小间隔尽可能大,因此再试着增大间隔 } else r=mid-1;//判断为假。说明间隔取大了,要减小 } printf("%d\n",result); } return 0;}
0 0
- POJ 2456 Aggressive cows 二分
- POJ 2456 Aggressive cows 二分
- poj 2456 Aggressive cows (二分)
- poj 2456 Aggressive cows 二分
- POJ - 2456 Aggressive cows 二分
- POJ 2456 Aggressive cows 【二分】
- POJ 2456 Aggressive cows(二分)
- POJ 2456 Aggressive cows 二分
- poj 2456 二分 Aggressive cows
- [POJ 2456]Aggressive cows[二分]
- 【POJ 2456 Aggressive cows】+ 二分
- poj 2456 Aggressive cows (二分)
- POJ 2456 Aggressive cows 二分
- poj 2456 Aggressive cows poj 3258 (二分)
- POJ 2456 Aggressive cows(二分)
- POJ 2456 - Aggressive cows(二分)
- poj 2456 Aggressive cows,二分,最大化最小值
- poj 2456 Aggressive cows(贪心+二分)
- 网页制作中的技巧
- html页面中meta的作用
- 关于Objective-C的内存管理图解
- 问题总结
- 递归法判断一个数组为递增
- POJ 2456 Aggressive cows(二分)
- centos5.x编译安装apache 手记
- C++中类的构造函数调用顺序
- SQL基础知识归纳总结
- java里的继承与多态
- IOS基础UI之(五)UIAlertView、UIActionSheet和UIAlertController详解
- BackboneJs入门学习[07]—Collection实践
- mongodb的常用 操作
- BestCoder Round #56 (div.2) (部分)