POJ2456 Aggressive cows

题目:http://poj.org/problem?id=2456

思路:二分经典题目,二分答案,判断间隔mid是否能容纳所有的奶牛。不过二分坑点比较多

例如查找值的时候,while里面写<=, 否则{1,3,5}查找不到5,返回值也是很迷的。这道题返回mid是错误的。可以从结束条件分析,结束条件:l > r, 前一个状态下的  l+1  了,所以最后返回  l-1(纯属个人理解)

推荐二分博客:https://blog.csdn.net/yefengzhichen/article/details/52372407

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
int n, dis;
long long d[100010];

int main() {
	while(~scanf("%d%d", &n, &dis)) {
		long long maxx = -1, minn = INF;
		for(int i = 0; i < n; i++) {
			scanf("%lld", &d[i]);
		}
		sort(d, d+n);
		long long l = 0, r =d[n-1]-d[0], mid;//
		while(l <= r) {//判断条件<=  例如1 3 5 如果<就不行了 
			mid = (r-l)/2+l;//间隔值 
			int zhi = 1;
			long long ans = d[0];//最左边开始 
			for(int i = 1; i < n; i++) {//判断是否用mid可以安排所有的奶牛 
				if(d[i] >= ans + mid) {
					zhi++;
					ans = d[i];
				}
				if(zhi>=dis)
					break;
			}
			if(zhi >= dis)//如果mid小 
				l = mid+1;
			else//mid大 
				r = mid-1;
		}
		printf("%lld\n", l-1);//不知道为什么mid不行 
	}
} 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值