题目链接:2456 -- Aggressive cows

题目描述:

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 wants 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?

农夫约翰搭建了一间有 N 间牛舍的小屋。牛舍排在一条线上,第 i 号牛舍在 Xi 的位置。但是他的 C 头奶牛对小屋很不满意,因此经常相互攻击。约翰为了防止奶牛之间相互伤害,因此决定把每头奶牛都放在离其他牛尽可能远的牛舍。求最近的两头奶牛之间距离的最大值。

输入格式:

t – 表示有t组数据,每组数据都由下面格式的数据构成。

第1行: 两个用空格隔开的整数: N 和 C (2 <= N <= 100,000)  (2 <= C <= N)

第2到n+1行: 每行一个整数 xi   (0 <= xi <= 1,000,000,000)

输出格式:

每组输出一个整数: 最近两头牛之间距离的最大值.

示范样例:

输入 

5 3
1
2
8
4
9

输出

3

题目分析:

我们先看一下输入输出样例:5间牛舍,3头奶牛,但是输入的牛舍数据不是规则排序的,因此我们应该先将其进行排序,得到1 2 4 8 9,然后易知两头奶牛之间的最近距离最大为3,此时3头奶牛的牛舍坐标分别为1,4,8或9。

由此看来我们在得到牛舍的位置数据时应该先对其进行排序,以便后续操作。

cin >> n >> c;//输入n座牛舍,c头奶牛for (int i = 0; i < n; i++) {cin >> a[i];}sort(a, a + n);//排序从a[0]开始,到a[n-1]结束,按照从小到大的顺序排列

我们从1,000,000,000/c到1枚举虽然可行,但是枚举比较耗时,效率不够高,这时我们就要用到二分的思想来提高效率了。

首先对二分内容明确一下:对两头奶牛之间的最近距离进行二分。因为牛舍的位置已经按照从大到小的顺序排列好了,我们的二分区间即为【1,1,000,000,000/c】(因为两头奶牛之间的最近距离为1——牛舍数/奶牛数)时间复杂度为log (1,000,000,000/c)*n(下面会解释)

代码片段:

 二分代码

void BinarySearch(int n, int c)//n为牛舍数,c为奶牛数
{int left = 0, right = a[n - 1] / c;//二分区间int mid = left + (right - left) / 2;//开始二分while (left <= right){if (check(mid, a, n, c))//假设的最近距离不够大{left = mid + 1;}else{right = mid - 1;}mid = left + (right - left) / 2;//继续二分}cout << right << endl;
}

二分的区间为【1,1,000,000,000/c】,check函数是检查二分得到的假设的最近距离是否为最大,如果不够大的话证明此时在mid前面的数据都不够大,因此left变为mid+1,如果够大的话同理可得此时mid后面的数据都够大,因此right变为mid-1来寻找最近的距离。每次检查都要从(1——1,000,000,000/c)遍历,所以这道题二分的时间复杂度为log (1,000,000,000/c)*n。

check函数检查的代码:

bool check(int mid, int a[], int n, int c)//检查所假设的两头奶牛之间的最近距离是否为最大
{int count = 1;//初始一头奶牛int cur = a[0];//当前牛舍地址for (int i = 1; i < n; i++)//从第二头牛开始放{if (a[i] - cur >= mid)//当前牛舍可以放牛{count++;//假设放置的奶牛数量加一cur = a[i];//当前牛舍地址更改}}if (count >= c)//在给定的mid值下能够放下的牛的个数大于实际奶牛个数c,说明两头奶牛之间的最近距离不够大{return 1;}return 0;
}

如果两头奶牛之间的最近距离不够大返回true(1),否则返回false(0)。

整体代码:

#include<iostream>
#include<algorithm>
using namespace std;
int a[100000] = { 0 };
bool check(int mid, int a[], int n, int c)//检查所假设的两头奶牛之间的最近距离是否为最大
{int count = 1;//初始一头奶牛int cur = a[0];//当前牛舍地址for (int i = 1; i < n; i++)//从第二头牛开始放{if (a[i] - cur >= mid)//当前牛舍可以放牛{count++;//假设放置的奶牛数量加一cur = a[i];//当前牛舍地址更改}}if (count >= c)//在给定的mid值下能够放下的牛的个数大于实际奶牛个数c,说明两头奶牛之间的最近距离不够大{return 1;}return 0;
}
void BinarySearch(int n, int c)
{int left = 0, right = a[n - 1] / c;//二分区间int mid = left + (right - left) / 2;while (left <= right){if (check(mid, a, n, c))//假设的距离不够大{left = mid + 1;}else{right = mid - 1;}mid = left + (right - left) / 2;}cout << right << endl;
}
int main()
{int n, c;cin >> n >> c;//首先输入n座牛舍和c头奶牛for (int i = 0; i < n; i++) {cin >> a[i];}sort(a, a + n);//将牛舍排序BinarySearch(n,c);return 0;
}

二分加上贪心的思想

Aggressive cows--二分法思想相关推荐

  1. Aggressive cows POJ2456

    Aggressive cows(愤怒的牛)(分治) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40455 Accepted: ...

  2. 二分搜索 POJ 2456 Aggressive cows

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

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

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

  4. python二分法排序_python实现快速排序的示例(二分法思想)

    本文介绍了python实现快速排序的示例(二分法思想),分享给大家,具体如下: 实现思路 将所需要的数字存入一个列表中 1.首先,设置将最左侧的那个数设置为基准数,在列表中索引为0 2.然后设置两个移 ...

  5. 对二分法思想的体会 及 结队编程情况汇报

    算法课第二章作业 1. 对二分法思想的体会: 二分法是分治法的一种,当遇到大问题难以解决的时候,可以使用二分法将问题细化,提高效率,减小问题规模.例如二分搜索,有效率高的优点,但是这个优点的实现前提是 ...

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

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

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

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

  8. Aggressive cows POJ - 2456

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

  9. POJ 2456 - Aggressive cows(二分)

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

  10. Aggressive cows(c语言)

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

最新文章

  1. sed修炼系列(四):sed中的疑难杂症
  2. 详细介绍Linux硬盘挂载步骤
  3. 基于Qt\C++实现的网络远程控制系统
  4. 企业网站前端制作实战教程 JQuery CSS JS HTML 登录表单验证
  5. JVM—类加载器和双亲委派模型
  6. linux负载均衡技术的分类,LinuxLVS负载均衡群集
  7. java string number_Java 学习(6):java Number Math String 数组...常用类型
  8. 2022年考研计算机-数据库原理8-11章
  9. android源代码居中字体,一篇文章了解移动端文本垂直居中
  10. android之DEX文件格式
  11. Goby - 新一代安全工具
  12. 手机网页端查看百度等搜索引擎网页快照的方法
  13. java加载dll文件失败
  14. linux shell 中各种符号的含义
  15. 有人(甚至国家)兜底就安全了吗?瑞士央行风暴小议。
  16. 朝闻道(刘慈欣小说)
  17. 五年Android开发大厂面经总结,吐血整理2022Android面试题合集(符解析)你确定不看看?
  18. Linux系统中,python需要import上一级目录文件的解决办法
  19. 联想0xc000007b蓝屏怎么修复
  20. Windows“自动修复”无法修复

热门文章

  1. 遭遇Excel的宏病毒
  2. 移动通信网络规划:D2D通信技术
  3. ExcelVBA:请注意!文档部分内容可能包含文档检查器无法删除的个人信息。
  4. 应用程序正常初始化(0xc0150002)失败
  5. mflac格式解密_mflac格式是什么意思
  6. C# MemCached
  7. C#随机生成姓名、电话类
  8. 嵌入式工程师学习路线(软件类)
  9. 云计算给IT产业结构带来的影响
  10. 有效沟通bic法则_有效沟通bic法则_合格职场人都会的3个有效的沟通法则