1007(分治法,快速排序,但还是时间超限)
2017-03-20 15:40
211 查看
#include <iostream> #include<cstdio> #include <iomanip> #include <cmath> #include <algorithm> using namespace std; struct Point { float x,y; bool operator <(const struct Point &t) { if(x==t.x) return y<t.y; return x<t.x; } bool operator >(const struct Point &t) { if(x==t.x) return y>t.y; return x>t.x; } } X[100001],Y[100001],Z[100001]; float pointDistance( Point m, Point n); float minDistance(int s,int e); void quickSort(int b,int e); int partSort(int bb,int ee); int main() { int N; while(cin>>N&&N!=0&&N>=2&&N<=100000) { float d; for(int i=0; i<N; i++) cin>>X[i].x>>X[i].y; quickSort(0,N-1); d=minDistance(0,N-1); float minRadius=d/2; cout<<fixed<<setprecision(2)<<minRadius<<endl; } return 0; } float minDistance(int s,int e) { float dd; if(e==s) return 0; else if(e-s==1) { dd=pointDistance(X[e],X[s]); return dd; } else if(e-s==2) { float d1=pointDistance(X[s],X[e]); float d2=pointDistance(X[s+1],X[e]); float d3=pointDistance(X[s],X[s+1]); dd= min(min(d1,d2),d3); return dd; } else { int mid=(s+e)/2; dd=min(minDistance(s,mid),minDistance(mid+1,e)) ; int k=0; for(int i=s; i<e; i++) if(fabs(X[i].x-X[mid].x)<dd) Z[k++]=X[i]; int l=k; k=0; mid=l/2; for(int i=0; i<l; i++) if(fabs(Z[i].y-Z[mid].y)<dd) Y[k++]=Z[i]; for(int i=0; i<k-1; i++) for(int j=i+1; j<k; j++) dd=min(dd,pointDistance(Y[i],Y[j])); return dd; } } float pointDistance(Point m, Point n) { float dx=m.x-n.x; float dy=m.y-n.y; return sqrt(dx*dx+dy*dy); } void quickSort(int b,int e) { if(b<e) { int q=partSort(b,e); quickSort(b,q-1); quickSort(q+1,e); } } int partSort(int bb,int ee) { int i=bb,j=ee+1;; Point temp,t=X[bb]; while(true) { while(X[++i]<t&&i<ee); while(X[--j]>t); if(i>=j) break; temp=X[i]; X[i]=X[j]; X[j]=temp; } X[bb]=X[j]; X[j]=t; return j; }弄了一天啊,连午饭都没吃,好不容易理解了个大概,可是还是时间超限,看了网上很多大神的,感觉最大的区别就是,我用的快速排序法,大神们用的algorithm中的sort函数,但是我看解释,两者的算法复杂度是一样的啊,一天啊,一天没弄出来这道题,真是笨啊。
相关文章推荐
- 1007(数组,时间超限)
- 分治、时间空间的权衡:最大合的连续字串问题 (PAT 1007)
- 递归分治解决快速排序和限行时间选择
- 4184: shallot 线段树+按时间分治+线性基
- [企业管理]外包还是招人——质量、队伍、诚信、成本、时间、需求……
- hdu 1007 平面最近点对 分治
- “开心偷菜”一梦8年终成空,终究还是输给了时间和规则!
- 算法设计与分析:第三章 分治 3.7线性时间选择
- XML串解析--时间长了总是忘记,还是先记下来好了
- 算法时间复杂度----分治与递归
- 终于还是决定用一晚上时间从新配置服务器
- 我的一位科学家同学在两个月内时间减肥68斤,效果明显啊! 牛人无论是学术还是减肥都是牛人!【转自张诗卓】
- hdu 1007 Quoit Design 最近点对(分治)
- 我爱天文 - 秒差距是时间单位还是距离单位?
- 【bzoj4311】向量 线段树按时间分治+凸包+三分
- java 时间对比,前一天还是后一天
- 递归与分治策略之线性时间选择(随机划分线性选择)
- 交换排序之快速排序原理、源码及时间、空间复杂度
- 递归与分治策略-----快速排序(C++)
- android得到系统时间如何判断是白天还是晚上