http://poj.org/problem?id=2456
题意:将c个奶牛放到n个格子里,使每个相邻奶牛之间的距离最小值最大,或者说,让奶牛的分布尽量平均。
思路:可以想到,一定存在一个距离,刚好满足能按此间隔放下所有奶牛,在此之前的间隔并没有完全利用所有的格子,大于这个间隔则放不下所有的奶牛。我们可以二分这个距离来找到我们想要的答案。
这个题算是二分思想的入门题,二分这个东西很神奇,在满足一定条件的时候,它可以在一个区间内进行log级别的查询。
什么样的结构可以发挥二分的用处呢?只需要考虑一件事情:我在知道某个位置的状态之后,是否可以确定,比这个位置更好的解与这个位置的前后关系。例如,具有单调性质的数列,在某个点会有状态改变的函数等。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,c;
int coor[100005];
int judge(int m){
if(m>coor[n-1])
return 0;
int s = 0,t = c-1,v = m;
while(s<n-1&&t){
if(coor[s]+v<=coor[s+1]){
v = m;
t--;
}
else v-=coor[s+1]-coor[s];
s++;
}
return t?0:1;
}
int main(){
scanf("%d%d",&n,&c);
for(int i = 0; i < n; i++)
scanf("%d",&coor[i]);
sort(coor,coor+n);
int l = 0, r = 1000000000/c,now;
while(l<=r){
int mid = l+(r-l)/2;
if(judge(mid)){
now = mid;
l = mid + 1;
}
else{
r = mid - 1;
}
}
printf("%d\n",now);
return 0;
}