题目: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
", l-1);//不知道为什么mid不行
}
}