POJ - 2456 二分解决

使用二分和贪心方法解决 POJ -2456

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int n, c;
int a[100100];
bool can(int x) { //贪心的存放,第一头牛放第一个位置,以此类推
	int cow = 1, p = 1;
	for (int i = 2; i <= n; i++) {
		if (a[i] - a[p] >= x) {  //看是否满足条件

			p = i;
			cow++;
		}
	}
	//cout <<"cow: "<<cow << endl;
	return cow >= c;
}
int find(int maxs) {
	int l = 1, r = maxs, m; //假设答案区间 从 1 到 maxs(最大坐标) ,开始解决
	int  ans=-1;
	while (l <= r) {
		m = (l + r) / 2;
		//cout <<"m: "<< m << endl;
		if (can(m)) { ans = m, l = m + 1; }//当满足条件时,应该去寻找更大的
		else r = m-1;
	}
	return ans;
}


int main() //最小值最大问题
{
	 
	while (~scanf("%d %d", &n, &c)) {
		memset(a, 0, sizeof(a));
		int maxs = 0;
		for (int i = 1; i <= n; i++) {
			scanf("%d", &a[i]);
			maxs = max(maxs, a[i]);
		}
		sort(a + 1, a + n + 1);
		int x = find(maxs);
		cout << x << endl;
	}
	

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值