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不行 
	}
} 

 

posted @ 2018-08-03 09:30  Frontierone  阅读(79)  评论(0编辑  收藏  举报