zoukankan      html  css  js  c++  java
  • poj3779(二分答案)

    Corral the Cows
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 1196   Accepted: 502

    Description

    Farmer John wishes to build a corral for his cows. Being finicky beasts, they demand that the corral be square and that the corral contain at least C (1 <= C <= 500) clover fields for afternoon treats. The corral's edges must be parallel to the X,Y axes.

    FJ's land contains a total of N (C <= N <= 500) clover fields, each a block of size 1 x 1 and located at with its lower left corner at integer X and Y coordinates each in the range 1..10,000. Sometimes more than one clover field grows at the same location; such a field would have its location appear twice (or more) in the input. A corral surrounds a clover field if the field is entirely located inside the corral's borders.

    Help FJ by telling him the side length of the smallest square containing C clover fields.

    Input

    Line 1: Two space-separated integers: C and N

    Lines 2..N+1: Each line contains two space-separated integers that are the X,Y coordinates of a clover field.

    Output

    Line 1: A single line with a single integer that is length of one edge of the minimum size square that contains at least C clover fields.

    Sample Input

    3 4
    1 2
    2 1
    4 1
    5 2

    Sample Output

    4

    Hint

    Explanation of the sample:

    |*   *
    
    | * *
    +------
    Below is one 4x4 solution (C's show most of the corral's area); many others exist.

    |CCCC
    
    |CCCC
    |*CCC*
    |C*C*
    +------

    Source

    二分边长进去检查

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    struct my{
        int x,y;
    };
    
    my a[1000];
    int mid;
    int tmp[1000];
    int c,n;
    
    bool cmp(const my &a,const my &b){
         return a.x<b.x;
    }
    
    bool judge(int l,int r)
    {
        int cnt=0;
        for(int i=l; i<=r; ++i) tmp[++cnt]=a[i].y;
        sort(tmp+1,tmp+cnt+1);
        for(int i=c; i<=cnt; ++i)
            if(tmp[i]-tmp[i-c+1]<=mid) return 1;
        return 0;
    }
    bool check(int x)
    {
        int l=1,r=1;
        for(; r<=n; ++r)
        {
            if(a[r].x-a[l].x>x)
                if(judge(l,r-1)) return 1;
            for(; a[r].x-a[l].x>x; ) l++;
        }
        return judge(l,n);
    }
    int main(){
        int x,y;
        scanf("%d%d",&c,&n);
        for (int i=1;i<=n;i++){
            scanf("%d%d",&x,&y);
            a[i].x=x;
            a[i].y=y;
        }
        sort(a+1,a+1+n,cmp);
        int l=0,r=10000;
        int ans=0;
        while(l<=r){
            mid=(l+r)>>1;
            if(check(mid)){
                r=mid-1;
                ans=mid+1;
            }
            else l=mid+1;
        }
        printf("%d",ans);
    return 0;
    }
  • 相关阅读:
    Java事务
    Mybatis二级缓存问题
    183.面试题 17.14. 最小K个数(快速排序)
    182. 跟着三叶学最短路径问题(存图方式)
    181. 差分数组学习
    AI大视觉(二十) | 小目标检测的tricks汇总
    CentOS7 上安装 mysql-5.7.26
    如何欺骗 Go Mod?
    .netcore docker常用命令-持续补充
    转载:登录后,用户配置被修改的处理方法
  • 原文地址:https://www.cnblogs.com/lmjer/p/8970478.html
Copyright © 2011-2022 走看看