zoukankan      html  css  js  c++  java
  • 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
    ",l);
    52     return 0;
    53 }
    View Code
  • 相关阅读:
    bzoj 1497: [NOI2006]最大获利
    bzoj 2733: [HNOI2012]永无乡
    [CF911G]Mass Change Queries
    [CF911F]Tree Destruction
    [CF911E]Stack Sorting
    [CF911D]Inversion Counting
    [CF911C]Three Garlands
    [CF911B]Two Cakes
    [CF911A]Nearest Minimums
    [POJ1201]Intervals
  • 原文地址:https://www.cnblogs.com/violet-acmer/p/9795836.html
Copyright © 2011-2022 走看看