poj 2456 Aggressive cows poj 3258 (二分)


poj 2456


// n点中选c点放下c头牛 是的n-1段距离中的最短距离最大 ,求这个最大的最短距离
//假设当前的最小值为x,如果判断出最小差值为x时可以放下C头牛,
//就先让x变大再判断;如果放不下,说明当前的x太大了,
//就先让x变小然后再进行判断。直到求出一个最大的x就是最终的答案。
# include <algorithm>
# include <string.h>
# include <stdio.h>
using namespace std;
int n,c,i,a[100010];
int judge(int x)
{
	int cot=1;
	int tmp=a[0];
	for(i=1;i<n;i++)
	{
		if(a[i]-tmp>=x)//距离大于栏的间隙 可以放下
		{
			cot++;
			tmp=a[i];
			if(cot>=c)//可以排下c头牛
				return true;
		}
	}
	return false;
}
int slove()//二分查找
{
	int l=0;//最小距离
	int r=a[n-1]-a[0];//最大距离
	while(l<=r)
	{
		int mid=(l+r)/2;
		if(judge(mid))//可以排下c头牛 
			l=mid+1;
		else
			r=mid-1;
	}
	return l-1;
}
int main()
{
	while(~scanf("%d%d",&n,&c))
	{
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		sort(a,a+n);
		printf("%d\n",slove());
	}
	return 0;
}




poj 3258 

include <algorithm>
# include <stdio.h>
# include <string.h>
using namespace std;
int n,m;
int a[50010];
int slove(int x)
{
	int cot=0;
	int tmp=a[0];
	for(int i=1;i<=n;i++)
	{
		if(a[i]-tmp>=x)
		{
			cot++;
			tmp=a[i];
			if(cot>=(n-m))
			return true;
		}
	
	}
	return false;
}
int main()
{
	int L,i;
	while(~scanf("%d%d%d",&L,&n,&m))
	{
		memset(a,0,sizeof(a));
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);
		sort(a,a+n+1);
		if(n==m)
		{
			printf("%d\n",L);
			continue;
		}
		int l=0;
		int r=L;
		while(l<=r)
		{
			int mid=(l+r)/2;
			if(slove(mid))
				l=mid+1;
			else
				r=mid-1;
		}
		printf("%d\n",l-1);
	}
	return 0;
}





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值