2019_GDUT_新生专题I选集 I HYSBZ - 1734

题目:

农夫 John 建造了一座很长的畜栏,它包括NN (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,…,xN (0 <= xi <= 1,000,000,000). 但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢
Input
第一行:空格分隔的两个整数N和C
第二行—第N+1行:i+1行指出了xi的位置
Output

第一行:一个整数,最大的最小值

Sample Input
5 3
1
2
8
4
9
Sample Output
3
把牛放在1,4,8这样最小距离是3

做法:将隔间排序,得到第一个隔间和最远的隔间之间的距离,然后对这个答案进行二分,如果当前的mid能符合题目的条件就在(mid,r]中间找,如果不信就去[l,mid)找。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,c,a[100010];

int check(int x)
{
	int t=a[1],ans=1;
	for (int i=2;i<=n;i++)
	{
		if (a[i]-t>=x)
		{
			ans++;
			t=a[i];
		}
	}
	if (ans>=c) return 1;
	else return 0;
}

int main()
{
	cin>>n>>c;
	for (int i=1;i<=n;i++)
	scanf("%d",a+i);
	sort(a+1,a+1+n);
	int l=0,r=a[n]-a[1],mid,ans;
	while (l<=r)
	{
		mid=(l+r)/2;
		if (check(mid))
		{
			l=mid+1;
			ans=mid;
		}
		else
		{
			r=mid-1;
		}
	}
	cout<<ans;
}
发布了14 篇原创文章 · 获赞 0 · 访问量 299

猜你喜欢

转载自blog.csdn.net/qq_39581539/article/details/103964676