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;
    }

  • 相关阅读:
    npm安装Vue及配置
    Node.js安装
    代码优化总结
    Java 读取文件指定行数的数据
    Navicat Premium 15 v15.0.17 数据库开发工具 安装激活详解
    发现了一个关于 gin 1.3.0 框架的 bug
    802.1X 账号密码+设备信息双重认证
    Vue项目入门(一)
    WPF登录界面
    使用“user32.dll”控制窗体
  • 原文地址:https://www.cnblogs.com/CKboss/p/3351141.html
Copyright © 2011-2022 走看看