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;
}

猜你喜欢

转载自www.cnblogs.com/lmjer/p/8970478.html