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