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; }
相关文章推荐
- javascript的一些各浏览器不兼容的地方
- Java编程中“为了性能”尽量要做到的一些地方
- HDU 1007 Quoit Design(最近点对问题:分治)
- spring3和spring4的一些需要注意的地方
- Java编程中“为了性能”尽量要做到的一些地方
- Java编程中“为了性能”尽量要做到的一些地方
- JavaScript高级程序设计,对书中一些不熟悉的地方做得笔记
- Ruby元编程的一些值得注意的地方
- Quoit Design - HDU 1007 分治
- Java编程中“为了性能”尽量要做到的一些地方
- windows 多线程捕获未处理的异常,防止崩溃的地方影响到其它线程
- 对ac自动机的一些个人理解
- 关于SpringMVC上传文件的一些细节和需要注意的地方
- 杭电OJ——1007 Quoit Design(最近点对问题)
- HDU 1007 Quoit Design竟然要分治
- pthreads v3下一些坑和需要注意的地方
- synchronized用到不同地方对代码产生的影响
- 多核技术给软件正确性带来的一些影响
- hdu 1007 && zoj 2107 Quoit Design [最近点对]
- java语法中一些需要注意的地方