poj 2456(二分)

传送门:Problem 2456

 

题意:

  最大化最近的两头牛之间的距离。

题解:

  关键:二分距离

  假设可以安排牛的位置使临近的两头牛之间的距离都不小于 d

  根据贪心的思想:

    (1)对牛舍的位置进行从大到小排序。

    (2)优先选取靠前的牛舍,因此第一头牛放入 1 号牛舍。

    (3)如果第 i 头牛放入了第 i 号牛舍,则第 i+1 头牛就要放入满足 x[i]+d <= x[k] 的最小的 k 号牛舍中。

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=1e5+50;
 6 
 7 int N,C;
 8 int x[maxn];
 9 
10 int binarySearch(int val)
11 {
12     int l=0;int r=N+1;
13     while(r-l > 1)
14     {
15         int mid=l+((r-l)>>1);
16         if(x[mid] >= val)
17             r=mid;
18         else
19             l=mid;
20     }
21     return r;
22 }
23 bool Check(int m)
24 {
25     int index=1;
26     int total=0;
27     while(index <= N)
28     {
29         total++;
30         index=binarySearch(x[index]+m);//二分查找出满足下一头牛距离当前牛的距离 >= m 的最小的下标
31     }
32     return total >= C ? true:false;
33 }
34 
35 int main()
36 {
37     scanf("%d%d",&N,&C);
38     for(int i=1;i <= N;++i)
39         scanf("%d",x+i);
40     sort(x+1,x+N+1);
41     //相邻两头牛间的可能距离范围为[l,r)
42     int l=0,r=1e9+50;
43     while(r-l > 1)
44     {
45         int mid=l+((r-l)>>1);
46         if(Check(mid))//如果mid满足条件,则范围变为[mid,r)
47             l=mid;
48         else
49             r=mid;//反之,范围变为[l,mid)
50     }
51     printf("%d\n",l);
52     return 0;
53 }
View Code
posted @ 2018-10-16 08:00  HHHyacinth  阅读(346)  评论(0编辑  收藏  举报