uva10245

“题目大意:
找出最近的点的距离。如果距离大于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;
}

你可能感兴趣的:(uva10245)