A - Aggressive cows POJ - 2456 (二分专题 )

https://vjudge.net/contest/241402#problem/A

题意:

有n个牛栏,选m个放进牛,相当于一条线段上有 n 个点,选取 m 个点,使得相邻点之间的最小距离值最大

思路:二分枚举相邻两牛的间距,判断大于等于此间距下能否放进所有的牛,具体详见代码。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,c,a[100005];
int judge(int x)    //判断当最小距离是x时,可放入几头牛 
{
	int i,s=1,p=a[0];      //一定从a[0]取 
	for(i=1; i<n; i++)
	{
		if(a[i]-p>=x)   
		{
			s++;//s记录放入几头牛 
			p=a[i]; //p记录上一个放入牛的房间 
		}
	}
	return s;
}
int main()
{
	int i,j;
	scanf("%d%d",&n,&c);
	for(i=0; i<n; i++)
		scanf("%d",&a[i]);
	sort(a,a+n);int mid;
	int low=0,high=a[n-1]-a[0];  //low和high表示可取的距离的上下界,二分查找符合要求的距离 
	while(high>=low)
	{
		 mid=(low+high)/2;
		if(judge(mid)>=c)   //如果可放入牛的数目>=c头牛的话,则满足条件,且最小值还可以继续扩大
			low=mid+1;
		else               // 最小值取大了,对左侧区间再进行二分查找。
			high=mid-1;
	}
	printf("%d\n",mid);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42079027/article/details/81235158
今日推荐