uva10245

来源:互联网 发布:oracle数据库发展历史 编辑:程序博客网 时间:2024/06/01 09:59

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