第八章:贪心+二分 题目::Aggressive cows

题目::Aggressive cows

农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这些小隔间的位置为x0,…,xN-1 (0≤xi≤1,000,000,000,均为整数,各不相同).John的C (2≤C≤N)头牛每头分到一个隔间。牛都希望互相离得远点省得互相打扰。怎样才能使任意两头牛之间的最小距离尽可能的大,这个最大的最小距离是多少呢?

思路:
二分距离范围,贪心距离是否满足题意
1.一组数的最大距离就是最小数和最大数的差值,这也是两头牛之间最大的最小距离,我们可以暴力一点,直接分割这个最大的最小距离,两头牛最小的最小距离就是1了,不过这样会超时,所以,我们可以选择二分距离。
2.找出某个距离后,我们需要测试一下这个距离符不符合要求,能够有>=C头牛放下,所以,我们利用贪心来进行判断,这里我会在代码里说明。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int a[1000007];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,c;
		scanf("%d %d",&n,&c);
		for(int i=0; i<n; i++)
		{
			scanf("%d",&a[i]);
		}
		
		sort(a,a+n);//贪心第一步,排序。
		int l=0,r=a[n-1];
		int mid,cnt;
		int best=0;
		while(l<=r)//二分距离 距离的范围在[0,a[n-1]] 
		{
			cnt=1;
			mid=(l+r)/2;
			int ben=a[0];
			for(int j=1; j<n; j++)//判断此距离是否符合要求 
			{//这里就利用了贪心的思想,我们排完序后,最优化的情况就是相邻之间判断距离和我们选出的距离关系,相邻之间小于选出的距离,就看加上下一个的距离,这样判断就是最优化的。
				if(ben+mid<=a[j]) {//理解这一步!!!!!!
					cnt++;
					ben=a[j];//每次确定一个房子,就要即使更新。
				}
				if(cnt>=c) break;
			}
			if(cnt<c) {
				r=mid-1;
			}else {
				l=mid+1;
				best=mid;
			}
		}
		printf("%d\n",best);
		
	}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值