zoukankan      html  css  js  c++  java
  • [洛谷][二分搜索]进击的奶牛

    进击的奶牛

    Description

    Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000,000)。

    他的C(2<=C<=N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?

    Input

    第1行:两个用空格隔开的数字N和C。

    第2~N+1行:每行一个整数,表示每个隔间的坐标。

    Output

    输出只有一行,即相邻两头牛最大的最近距离。

    Examples

    Input

    5 3
    1 
    2 
    8 
    4 
    9 

    Output

    3

    正确解法:

    求最大距离中的最小值。

    通过推测,第一只奶牛一定在第一个棚子里,他们中间的最大距离为 a[n]-a[1],最少有两只奶牛,最大距离为牛棚的两端。

    当然这是最极限的情况,基本不可能发生。

    另一个极限情况是奶牛都挤在一起。最小距离为1.

    从1到a[n]-a[1] 开始查找,首先是中间值开始找,如果符合条件,就中间值往后,不符合就中间值之前。

    符合条件:

    第一只牛在第一个棚子,第二只牛至少在 上一只牛+m 位置的棚子里。更新上一只牛的位置。

    最后求最多能放多少只牛。

    如果牛的数量大于 c (现有牛的数量)  那就符合条件。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<string>
     5 #include<cmath>
     6 #include<algorithm>
     7 using namespace std;
     8 int n, c;
     9 int a[100010];
    10 bool judge(int x)
    11 {
    12     int ans = 1,last=1;
    13     for (int i = 2; i <= n; i++)
    14     {
    15         if (a[i] - a[last] >= x)
    16         {
    17             ans++;
    18             last = i;
    19         }
    20     }
    21     if (ans >= c)    return 1;
    22     return 0;
    23 }
    24 int main()
    25 {
    26     cin >> n >> c;
    27     for (int i = 1; i <= n; i++)
    28         cin >> a[i];
    29     sort(a + 1, a + n + 1);
    30     int l = 1, r = a[n] - a[1];
    31     while (l <= r)
    32     {
    33         int mid = (l + r) / 2;
    34         if (judge(mid))    l = mid + 1;
    35         else r = mid - 1;
    36     }
    37     cout << r << endl;
    38     return 0;
    39 }
    View Code
    No matter how you feel, get up , dress up , show up ,and never give up.
  • 相关阅读:
    Permutations II
    N-Queens II
    Palindrome Number
    Minimum Path Sum
    JS的DOM操作2
    JS 的DOM操作
    函数概念
    JavaScript数组
    JavaScript循环及练习
    JS语言
  • 原文地址:https://www.cnblogs.com/Kaike/p/9925313.html
Copyright © 2011-2022 走看看