hd-1007 Quoit Design一些小地方足以影响能否ac

来源:互联网 发布:vc和vb能同时吃吗 编辑:程序博客网 时间:2024/05/08 13:33

         整到题的主体算法思想是看了变成之美才写出来的,可以多次提交都没有ac,总是超时,然后去网上查代码,发现用分治和二分法不会超时呀,然后慢慢的检查代码的各个部分,最后发现,在将所有点分为左右两部分的时候,自己写的代码有问题,每次循环都调用了fabs函数,造成额外开销,造成了超时

下面是代码:

#include<iostream>#include<cmath>#include<fstream>#include<algorithm>const int maxs=100005;using namespace std;class point{    public:double x;double y;char index;};point points[maxs],pointx[maxs];bool compx(point a,point b){if(a.x==b.x){    return a.y<b.y;}else    return a.x<b.x;}bool compy(point a,point b){if(a.y==b.y){    return a.x<b.x;}elsereturn a.y<b.y;}double getdis(point a,point b){double chax=a.x-b.x;double chay=a.y-b.y;return sqrt( chax*chax+chay*chay);}double mindis(double a,double b){if(a<=b)return a;else return b;}double get_distance(int l,int r){if(l+1==r){    return getdis(points[l],points[r]);}else if(l+2==r){  double s1,s2,s3;  s1=getdis(points[l],points[l+1]);  s2=getdis(points[l+1],points[l+2]);  s3=getdis(points[l],points[l+2]);  return mindis(mindis(s1,s2),s3);}    else {        double leftmin,rightmin;        int mid=(r+l)/2;        int m=0;        leftmin=get_distance(l,mid); rightmin=get_distance(mid+1,r);        double dis=mindis(leftmin,rightmin);      /*  for(int i=l;i<=r;++i){//超时            if(fabs(points[i].x-points[mid].x)<=dis){ //每次都要调用fabs,造成了额外的开销,造成超时                if(points[i].x<=points[mid].x){                  pointx[m]=points[i];                pointx[m].index='l';                ++m;                }else{                pointx[m]=points[i];                pointx[m].index='r';                ++m;                }            }        } */        for ( int i = l; i <= mid; i++){double leftCoord = points[mid].x - dis;if (points[i].x >= leftCoord){pointx[m].index = 'l';  /*标识属于左边部分*/pointx[m].x = points[i].x;pointx[m].y = points[i].y;m++;}}for (  int i=mid+1; i <= r; i++){double rightCoord = points[mid].x + dis;if (points[i].x <= rightCoord){pointx[m].index = 'r';  /*标识属于右边部分*/pointx[m].x = points[i].x;pointx[m].y = points[i].y;m++;}}        sort(pointx,pointx+m,compy);        for(int k=0;k!=m;++k){ //自己写的            if(pointx[k].index=='l'){                for(int n=1;n<=7&&k+n<m;++n){if(pointx[k+n].index!='r')continue;                double tem=getdis(pointx[k],pointx[k+n]);                    if(tem<dis) dis=tem;                }                 for(int p=1;p<=7&&k-p>=0;++p){                        if(pointx[k-p].index!='r')continue;                   double tem=getdis(pointx[k],pointx[k-p]);                    if(tem<dis) dis=tem;                }            }        }      return dis;    }}int main(){int n;while(cin>>n&&n!=0){    for(int i=0;i!=n;++i){        cin>>points[i].x>>points[i].y;    }        sort(points,points+n,compx);double dis;dis=get_distance(0,n-1);cout.precision(2);  cout<<fixed<<dis/2<<endl;}return 0;}


0 0
原创粉丝点击