zoukankan      html  css  js  c++  java
  • loj1011愤怒的牛

    题目描述

    原题来自:USACO 2005 Feb. Gold

    农夫约翰建造了一座有 n 间牛舍的小屋,牛舍排在一条直线上,第 i 间牛舍在 x_i 的位置,但是约翰的 m 头牛对小屋很不满意,因此经常互相攻击。约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其它牛尽可能远的牛舍。也就是要最大化最近的两头牛之间的距离。

    牛们并不喜欢这种布局,而且几头牛放在一个隔间里,它们就要发生争斗。为了不让牛互相伤害。John 决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是多少呢?

    输入格式

    第一行用空格分隔的两个整数 n 和 m

    第二行为 n 个用空格隔开的整数,表示位置 x_i

    输出格式

    输出仅一个整数,表示最大的最小距离值。

     

    样例

    样例输入

    5 3
    1 2 8 4 9
    

    样例输出

    3
    

    样例解释

    把牛放在 1,4 8 , 这样最小距离是 3 。

    数据范围与提示

    2<=n<=1e5 , 0<=x_i<=1e9 , 2<=m<=n 

     _________________________________________
     
    简单的二分答案
    _________________________________________
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1e5+10;
     4 int n,m;
     5 int dis[maxn];
     6 bool pd(int x)
     7 {
     8     int l=1,r=1,rt=1  ;
     9     while(r<=n)
    10     {
    11         while(r<=n && dis[r]-dis[l]<x)++r;
    12         if(r<=n)
    13         {
    14             rt++;
    15             l=r;
    16         }
    17     }
    18     return rt>=m;
    19 }
    20 int main()
    21 {
    22     scanf("%d%d",&n,&m);
    23     int ans,l=1,r=0;
    24     for(int i=1;i<=n;++i)
    25     {
    26         scanf("%d",&dis[i]);
    27         r=max(dis[i],r);
    28     }
    29     sort(dis+1,dis+1+n);
    30     while(l<=r)
    31     {
    32         int mid=(l+r)>>1;
    33         if(pd(mid))ans=mid,l=mid+1;
    34         else r=mid-1;
    35     }
    36     cout<<ans;
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    Kafka 生产者 自定义分区策略
    同步互斥
    poj 1562 Oil Deposits(dfs)
    poj 2386 Lake Counting(dfs)
    poj 1915 KnightMoves(bfs)
    poj 1664 放苹果(dfs)
    poj 1543 Perfect Cubes (暴搜)
    poj 1166 The Clocks (暴搜)
    poj 3126 Prime Path(bfs)
    处理机调度
  • 原文地址:https://www.cnblogs.com/gryzy/p/13984042.html
Copyright © 2011-2022 走看看