POJ T2456 Aggressive cows(二分搜索:最大化最小值)

                           POJ T2456  Aggressive cows


题解:

  可以套用二分搜索求解最优解的模型(这个博客

  题意是有N个牛舍,C头牛,给出的牛舍位置并不按顺序。因为牛之间会打架,所以要求两两牛之间能隔开的最大距离。(一头牛一个牛舍)。

  这是二分搜索最大化最小值的例子。

  C(d):安排牛的位置使得任意牛之间的距离大于等于d

  1.牛舍位置无序,先排序

  2. 第一头牛放入第一个牛舍

  3.第i头牛放入Xj的牛舍,则第i+1头牛放入牛舍需满足Xj + d <= Xk

 

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1e5;
const int INF = 1e9; 
int sta[MAXN+5],n,c;
bool vis[MAXN+5];

bool judge(int x){
	int sp = 0;
	for(int i = 1; i < c; ++i){
		int np = sp+1;
		while(np < n && sta[np] - sta[sp] < x)
			np++;
		if(np == n) return false;
		sp = np;
	}
	return true;
}

void solve(){
	int L = -1,R = INF;
	while(R - L > 1){
		int mid = (L + R)/2;
		if(judge(mid)) L = mid;
		else R = mid;
	}
	printf("%d\n",L);
}

int main(){
	while(~scanf("%d%d",&n,&c)){
		for(int i = 0; i < n; ++i)
			scanf("%d",&sta[i]);
		sort(sta,sta+n);
		solve();
	}
	return 0;
} 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值