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
- hd-1007 Quoit Design一些小地方足以影响能否ac
- 1007:Quoit Design
- HDOJ 1007 Quoit Design
- hdu 1007 Quoit Design
- hdu 1007 Quoit Design
- hdu 1007 Quoit Design
- HDU-1007 Quoit Design
- hdu 1007 Quoit Design
- hdu 1007 Quoit Design
- hdu 1007 Quoit Design
- HDU 1007 Quoit Design
- HDU 1007 Quoit Design
- HDU 1007 Quoit Design
- hdu-1007-Quoit Design
- HDU 1007 Quoit Design
- hdu 1007 - Quoit Design
- HDOJ 1007 Quoit Design
- hdu 1007 Quoit Design
- 二分匹配模版
- HDU 3018 Ant Trip(欧拉回路:一笔画问题)
- 在Windows下如何解决Cocos2d-x中实例代码TestCpp找不到lib库文件的问题
- Android Fragment——详解
- undefined reference问题总结
- hd-1007 Quoit Design一些小地方足以影响能否ac
- 关于程序两次点击才能正常响应的问题
- 重载
- JavaScript中String对象处理HTML标记中文本的方法
- 黑马程序员---java基础加强---高新技术JDK1.5新特性
- hdu 4776 Ants
- 设计模式——命令模式(Command)
- apache的配置
- 求助 Eclipse + NDK error: stray '\24' in program