Aggressive cows(二分)

本文介绍了一种解决农场主人John如何最大化牛栏间距离的问题,通过二分查找算法,确保在n个牛栏和c头牛的约束下,找到最小间距的最大值。适合处理大规模数据问题。

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

Hint
OUTPUT DETAILS:

FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3.

Huge input data,scanf is recommended.

题意: n个牛栏,c头牛,把牛放到牛栏中,求牛之间最大间距中的最小距离,实际上就是让任意两头牛间的间距相等,求这个间距最大为多少

思路: 数据较大,可用二分降低时间复杂度,首先确定边界,最小为0,最大为 最大的牛栏编号-最小的牛栏编号,最大可大不可小,也可以定义最大为 最大的牛栏编号,或数据边界,然后就二分查找,直到找到答案为止

AC代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[110000],n,c;
int find(int x)
{
	int pre=0,sum=1,i;//pre=0,想得到最大距离,一定要用编号最小的牛棚
	for(i=0; i<n; i++)
	{
		if(a[i]-a[pre]>=x)
		{
			sum++;//记录在相邻两个牛棚的距离为mid时,能放几头牛
			pre=i;//更新下标,便于计算相邻两个牛棚的距离
		}
	}
	if(sum>=c)//能放下c头牛返回1
		return 1;
	return 0;
}
int main()
{
	int i,j,k;
	scanf("%d%d",&n,&c);
	for(i=0; i<n; i++)
		scanf("%d",&a[i]);
	sort(a,a+n);
	int l=a[0],r=a[n-1],mid;
	while(l<=r)
	{
		mid=(l+r)/2;
		if(find(mid))//能放下c头牛
		{
			k=mid;//记录此时的最小距离
			l=mid+1;
		}
		else
			r=mid-1;
	}
	printf("%d\n",k);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值