代码是抄的 代码在 discuss里面
注释是思路,
简单的讲就是先把近的点放在一起然后看周围6个点的距离最近的值

#include <cstdio>
using namespace std;
const int MAX = 100000000;
//单纯的点和x+y的值
struct node
{
    double x;
    double y;
    double s;
};
//快排
bool comp(node a,node b)
{
    return a.s < b.s;
}
int main()
{
    int i, j, k, u, n, m, cnt;
    struct node ar[100010];
//当sa[1000010]会报错  seg...  core错误
    double sa[100010], a, b, c, min;
    while(scanf("%d",&n)!=EOF){
        if(n == 0)
            break;
        //cout<<"hello"<<endl;
        for(i = 1;i<=n;i++){
            scanf("%lf %lf",&ar[i].x, &ar[i].y);
            ar[i].s = ar[i].x + ar[i].y;
        }
        sort(ar+1,ar+1+n,comp);//排序
       /* for(i=1;i<=n;i++)
        {
            cout<<ar[i].x<<ar[i].y;
        }*/
        cnt = 1;
        min = MAX;
	//经过排序以后所有靠近的点都在附近所以可以选取周围的六个比较距离选取最近的距离
        for (i = 1;i<=n;i++)
        {
            for(j =i+ 1;j<i+1+6 &&j<=n;j++)
            {
                sa[cnt] = sqrt((ar[i].x - ar[j].x)*(ar[i].x - ar[j].x)+\
                (ar[i].y-ar[j].y)*(ar[i].y-ar[j].y));
                if(min > sa[cnt])
                {
                    min = sa[cnt];
                }
                cnt++; 
            }
        }
        printf("%.2lf\n",min/2.0);
    }
    return 0;
}
posted on 2017-06-06 13:54  HDU李少帅  阅读(189)  评论(0编辑  收藏  举报