“题目大意:
找出最近的点的距离。如果距离大于10000 就等同于INFINITY
思路:
刚开始想说直接暴力的,但是看了数据觉得会超时,
所以就去看了题解。第一次做分治问题。
代码:
#include <iostream>
using namespace std;
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <cmath>
struct node {
double x,y;
}n[10003];
bool cmp(node a, node b) {
return a.x < b.x;
}
double dis(node a,node b) {
return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}
double findmin(int a,int b) {
if(a > b) return 40004;
if(a == b-1) return dis(n[a],n[b]);
int l = (a + b) / 2 , r = (a + b) / 2, mid = (a + b) / 2;
double d = min(findmin(a,mid-1),findmin(mid+1,b));
while(l >= a && d > n[mid].x - n[l].x) l--;
while(r <= b && d > n[r].x - n[mid].x) r++;
for(int i = l + 1 ; i < r; i++)
for(int j = i + 1; j < r; j++)
d = min(d,dis(n[i],n[j]));
return d;
}
int main() {
int N;
while(scanf("%d",&N) && N) {
for(int i = 0 ; i < N; i++)
scanf("%lf %lf",&n[i].x,&n[i].y);
sort(n,n+N,cmp);
double d =findmin(0,N-1);
if(d >= 10000)
printf("INFINITY\n");
else
printf("%.4lf\n",d);
}
return 0;
}