POJ2456 -- Aggressive cows(二分搜索)

来源:互联网 发布:windos无法连接到网络 编辑:程序博客网 时间:2024/05/18 18:46


问题描述:

有n个摊位,坐标分别为x1,x2...xn

从中选择c个摊位,使这c个摊位任意两个之间的最小距离最大

可以换一个角度思考:选择一个距离x 代表这c个选择的摊位中的最小距离

我们要使用二分法搜索的就是满足条件的最大x

令C(x):满足条件的最大x 这里需要满足的条件是:由于我们选择的摊位最小距离为x 那么我们必须保证这n个摊位中可以找到c个摊位,使相邻的2个摊位的距离大于等于x


代码:

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int stall[100000 + 5];const int INF = 1000000000;int n ,c;bool C(int x){int num = 0; num = 1;int now = stall[0]; for(int i= 1 ;i<n ;i++){if(stall[i] >= now + x){now = stall[i];num++;if(num >=c)return true;}}return false;}int main(){scanf("%d %d",&n,&c);for(int i = 0;i<n;i++){scanf("%d",&stall[i]);}sort(stall,stall +n);int l = 0;int r = INF;for(int i = 0;i<100;i++){int mid = (l+r)/2;if(C(mid)) l = mid;elser = mid;}printf("%d\n",l);}

由于我们要解决的是满足条件的最大值

也就是用二分搜索法解决最大化问题

因此当满足条件时,应把区间由(l,r)改为(mid,r),

原创粉丝点击