zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    Kubernetes 集成研发笔记
    Rust 1.44.0 发布
    Rust 1.43.0 发布
    PAT 甲级 1108 Finding Average (20分)
    PAT 甲级 1107 Social Clusters (30分)(并查集)
    PAT 甲级 1106 Lowest Price in Supply Chain (25分) (bfs)
    PAT 甲级 1105 Spiral Matrix (25分)(螺旋矩阵,简单模拟)
    PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)
    java 多线程 26 : 线程池
    OpenCV_Python —— (4)形态学操作
  • 原文地址:https://www.cnblogs.com/CKboss/p/3351141.html
Copyright © 2011-2022 走看看