您的位置:首页 > 其它

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

2014-06-12 19:51 211 查看
整到题的主体算法思想是看了变成之美才写出来的,可以多次提交都没有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;
}else
return 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: