HDOJ 1007(T_T)

就是求平面上N点间的最短距离,但是没过;老是Compilation Error但其实是可以运行的啊
人挫没办法!
以下是代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <iomanip>

#define MM 100020
using namespace std;

struct Note
{
    double x;
    double y;
}pt[MM];

int _sort1[MM];
int _sort2[MM];

double min(double& x,double& y)
{
    if(x-y>=1e-6)
       return y;
    else return x;
}

int cmp_x(const void *a,const void *b)
{
    if(((Note*)a)->x>((Note*)b)->x)  return 1;
    else return -1;
}

int cmp_y(const void *a,const void *b)
{
    if(pt[(*(int*)a)].y>pt[(*(int*)b)].y)  return 1;
    else return -1;
}
double distan(Note a,Note b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

double neardis(int first,int ends)
{
    if(ends-first==1)  return distan(pt[first],pt[ends]);
    if(ends-first==2)  return min(min(distan(pt[first],pt[first+1]),distan(pt[first],pt[ends])),distan(pt[first+1],pt[ends]));

    int mid=(first+ends)/2;
    double dis1=neardis(first,mid);
    double dis2=neardis(mid+1,ends);
    double dota=min(dis1,dis2);
    int _end1=0;
    int _end2=0;

    for(int i=mid;i>first&&distan(pt,pt[mid])<=dota;i--)
    {
        _sort1[_end1++]=i;
    }
    for(int i=mid+1;i<ends&&distan(pt,pt[mid])<=dota;i++)
    {
        _sort2[_end2++]=i;
    }

    qsort(_sort1,_end1,sizeof(_sort1[0]),cmp_y);
    qsort(_sort2,_end2,sizeof(_sort2[0]),cmp_y);

    double min_dis=dota;

    for(int i=0;i<_end1;i++)
    {
        for(int j=0;j<_end2;j++)
        {
            if(fabs(pt[_sort2[j]].y-pt[_sort1].y)-dota>1e-6)   continue;
                //网上的6个点什么的就是在这里用到的防止特殊情况下超时,鸽?///笼原理什么的
            dota=distan(pt[_sort1],pt[_sort2[j]]);
            min_dis=min(min_dis,dota);
        }
    }
    return min_dis;
}

int main()
{
    int n;
    cin>>n;
    while(n)
    {
        for(int i=0;i<n;i++)
            cin>>pt.x>>pt.y;
        qsort(pt,n,sizeof(pt[0]),cmp_x);
        cout<<fixed<<setiosflags(ios::showpoint)<<setprecision(2)<<neardis(0,n-1)/2<<endl;
        cin>>n;
    }
    return 0;
}

还有一个:超时
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cmath>

#define MM 100010
#define eps 1e-6

using namespace std;

struct Note
{
    double x;
    double y;
}pt[MM];

int Y_sort1[MM];
int Y_sort2[MM];

double min(double& a,double& b)
{
    if(a-b>eps)  return b;
    else return a;
}

double distan(Note &a,Note &b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

int cmp_x(const void *a,const void *b)
{
    if(((Note*)a)->x-((Note*)b)->x>eps)  return 1;
    else return -1;
}

int cmp_y(const void *a,const void *b)
{
    if(pt[*(int*)a].y-pt[*(int*)b].y>eps)  return 1;
    else return -1;
}

double neardis(int _first,int _end)
{
    if(_end-_first==1)  return distan(pt[_first],pt[_end]);
    if(_end-_first==2)  return min(min(distan(pt[_first],pt[_end]),distan(pt[_first+1],pt[_end])),distan(pt[_first],pt[_first+1]));

    int _mid=(_first+_end)/2;
    double dis1=neardis(_first,_mid);
    double dis2=neardis(_mid+1,_end);
    double dota=min(dis1,dis2);

    int sort1=0;
    int sort2=0;
    for(int i=_first;i<=_mid&&(distan(pt,pt[_mid])-dota)<eps;i++)
    {
        Y_sort1[sort1++]=i;
    }
    for(int i=_mid+1;i<=_end&&(distan(pt,pt[_mid])-dota)<eps;i++)
    {
        Y_sort2[sort2++]=i;
    }

    qsort(Y_sort1,sort1,sizeof(Y_sort1[0]),cmp_y);
    qsort(Y_sort2,sort2,sizeof(Y_sort2[0]),cmp_y);
    for(int i=0;i<sort1;i++)
    {
        for(int j=0;j<sort2&&fabs(pt[Y_sort2[j]].y-pt[Y_sort1].y)<=dota;j++)
        {
            double dota2=distan(pt[Y_sort2[j]],pt[Y_sort1]);
            dota=min(dota,dota2);
        }
    }

    return dota;

}

int main()
{
    int n;
    cin>>n;
    while(n!=0)
    {
        for(int i=0;i<n;i++)
        {
            cin>>pt.x>>pt.y;
        }
            qsort(pt,n,sizeof(pt[0]),cmp_x);
            cout<<fixed<<setiosflags(ios::showpoint)<<setprecision(2)<<neardis(0,n-1)/2<<endl;

        cin>>n;
    }
    return 0;
}

posted @ 2013-03-04 01:27  码代码的猿猿  阅读(144)  评论(0编辑  收藏  举报