Aggressive cows(愤怒的牛)(分治)

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 40455 Accepted: 18254

Description

Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,…,xN (0 <= xi <= 1,000,000,000).

His C (2 <= C <= N) cows don’t like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?

Input

  • Line 1: Two space-separated integers: N and C
  • Lines 2…N+1: Line i+1 contains an integer stall location, xi

Output

  • Line 1: One integer: the largest minimum distance

Sample Input

5 3
1
2
8
4
9

Sample Output

3

题目大意:

农场主约翰新建了一个有n个牛棚的农舍,这些牛棚位于一条直线x1,x2,x3…xn(0<=xi<=1,000,000,000)上。他的c(2<=c<=n)头牛不喜欢这个牛棚的布局,如果把这些牛放在一个牛棚的话,它们就会变得非常愤怒,会攻击其他牛,为了防止这些牛相互攻击,农场主约翰想要把这些牛分散放在牛棚里,就像在两头牛之间尽可能大的最小距离,这个最大化的最小值是多少呢?
输入:
第1行:两个独立的数N(N个牛棚)和C (C头牛)
第2到N+1行:牛舍的位置Xi
输出:最大化的最小距离

分析

把牛舍的位置保存在数组中x[]中,排一下序。
最远的牛栏为x[0]和x[n-1];我们查找一个dis,使得以dis为最小距离时,所有的牛都能放进牛棚。
dis的范围是[1,n-1]。当然我们可以使用枚举法,但效率太低。这里我们可以使用二分搜索,用ans记录能放下所有牛的最大的dis。
首先left=x[0], right=x[n-1], dis=mid=(left+right)/2;
用这个mid去试能不能放下所有牛,如果可以,left=mid+1,更新ans=mid;
如果不可以,right=mid-1;
直到left>=right退出循环。

关键代码

 left=x[0];right=x[n-1];while(left<=right){mid=(left+right)/2;if(check(mid)){if(mid>ans) ans=mid;left=mid+1;}else{right=mid-1;}   }

检查mid是否符合题意

bool Judge(int dis){int cnt=0;int i;int start=x[0];cnt++;for(i=1;i<n;i++){if(x[i]-start>=dis){cnt++;start=x[i];}}if(cnt>=c) return true;else return false;
}

具体实现时可以递归实现,也可以非递归实现。
非递归代码

//非递归
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
//定义 牛舍的数量
int x[100001],n,c;
//判断该距离下牛能否被全部放下
bool Judge(int dis){//初步定义牛舍中牛的数量以及牛的位置 int cnt=0,i,start=x[0];//已经在x【0】处放置了一头牛 start记录上一头牛的位置 cnt++;for(i=1;i<n;i++){//如果位置适合 放入牛 if(x[i]-start>=dis){cnt++;//更新start的值 start=x[i];//如果牛已经放置完了 if(cnt==c) break;}}if(cnt>=c) return true;elsereturn false;
}int main(){int i=0,left,right,mid;scanf("%d %d",&n,&c);for(i=0;i<n;i++)scanf("%d",&x[i]);   //对牛舍进行排序 sort(x,x+n);//二分法查找最合适的距离 left=x[0];right=x[n-1];while(left<=right){mid=(left+right)/2;//调用check函数 如果足够装得下这c头奶牛 说明mid小于所求解 需要更新midif(Judge(mid)){left=mid+1;}else{right=mid-1;}   }printf("%d",right);return 0;
}

递归代码

//递归
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
//定义 牛舍的数量
int x[100001],n,c;
//判断该距离下牛能否被全部放下
bool Judge(int dis){//初步定义牛舍中牛的数量以及牛的位置 int cnt=0,i,start=x[0];//已经在x[0]处放置了一头牛 start记录上一头牛的位置 cnt++;for(i=1;i<n;i++){//如果位置适合 放入牛 if(x[i]-start>=dis){cnt++;//更新start的值 start=x[i];//如果牛已经放置完了 if(cnt==c) break;}}if(cnt>=c) return true;elsereturn false;
}
int Search(int left,int right){int mid;if(left>right) return right;mid=(left+right)/2;if(Judge(mid)) return Search(mid+1,right);else return Search(left,mid-1);
}
int main(){int i=0,left,right,ans;scanf("%d %d",&n,&c);for(i=0;i<n;i++)scanf("%d",&x[i]);//对牛舍进行排序 ,快排的时间复杂度是O(nlogn) sort(x,x+n);//二分法查找最合适的距离 left=x[0];right=x[n-1];ans=Search(left,right);printf("%d",ans);return 0;
}

Aggressive cows POJ2456相关推荐

  1. 二分搜索 POJ 2456 Aggressive cows

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

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

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

  3. BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )

    最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #inc ...

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

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

  5. Aggressive cows POJ - 2456

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

  6. poj2456 Aggressive cows(二分查找)

    https://vjudge.net/problem/POJ-2456 二分,从最大长度开始,不断折半试,如果牛全放下了,就是可行,修改下界,否则改上届. 1 #include<iostream ...

  7. POJ2456 Aggressive cows

    题目:http://poj.org/problem?id=2456 思路:二分经典题目,二分答案,判断间隔mid是否能容纳所有的奶牛.不过二分坑点比较多 例如查找值的时候,while里面写<=, ...

  8. POJ 2456 - Aggressive cows(二分)

    Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stal ...

  9. Aggressive cows(c语言)

    题目描述 Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are ...

最新文章

  1. 提供第三种代码生成方式——通过自定义BuildProvider为ASP.NET提供代码生成
  2. 斯蒂芬斯蒂芬但是当时发生的s
  3. IDEA上传本地项目到SVN
  4. A - A Dangerous Maze
  5. Hive练习之join
  6. 实现日志文件直接导入数据库
  7. 提示编码有问题时,VS保存选项
  8. 多人麻将源码 html5,新版大众麻将 H5版
  9. 游戏框架(框架入门篇)
  10. MATLAB读取MIT心电信号
  11. java中下标和标识符_如下哪个是 Java 中的标识符 ( )_学小易找答案
  12. in_array函数漏洞
  13. 冯·米塞斯迭代法(Von Mises iteration)
  14. 关于Liferay的deactivate user的研究
  15. 360无线网怎么没有网络连接到服务器,360路由器设置成二级路由器教程 | 192路由网...
  16. od机考题目-机器人走迷宫
  17. 计算机提示存储空间不足怎么办,电脑提示存储空间不足,无法处理此命令是什么原因?怎么解决?...
  18. 最新apktool_2.4.1
  19. anki卡片浏览器_Anki Guide by Corkine
  20. 对于一个基本有序的数组进行排序

热门文章

  1. 漫画:入职前 vs 入职后
  2. SSD-pytorch踩坑及修正(StopIteration)
  3. HNUST-OJ-1691 琅琊榜
  4. 机器学习(周志华) 第十一章特征选择与稀疏学习
  5. 教你如何从Google Map爬数据
  6. 想测试一下你对HTML5有多了解么? 试试Nettuts+的小测验吧!
  7. 一、团队建设能力在管理中的应用(注重协作)
  8. 开发wap wap简介 WAP 网络应用 网络协议 XML
  9. 牛奶神马搜索权重批量查询软件【SEO必备工具】
  10. 分子动力学模拟学习——VMD安装