题目是要求最近点对的距离,采用简单贪心:按x+y来排序,再一次遍历,求出相邻点对的最小距离。用G++一直TLE,实在是无语,看了discuss,有人说要用C++提交,结果用C++就直接AC了。另一位大牛用的暴力搜索,时间居然比我贪心还少,难以理解。
AC代码:
#include<iostream> #include<algorithm> #include<iomanip> #include<math.h> #include<stdio.h> using namespace std; #define NUM 100005 struct point { double x; double y; }points[NUM]; bool cmp(point a, point b) { return a.x+a.y < b.x+b.y; } double findDistance(point a, point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main() { int n,i,j; double res,step; //freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin); while(cin>>n&&n!=0){ for(i=0;i<n;i++){ cin>>points[i].x>>points[i].y; } sort(points,points+n,cmp); res=1e10; for(i=1;i<n;i++){ step=findDistance(points[i],points[i-1]); if(step<res) res=step; } printf("%.2lf\n",res/2); } return 0; }
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; struct node { double x,y; }g[100008]; int cmp(node a,node b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } double DIS(node x,node y) { return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y)); } int main() { int i,j,k,m,n; double sum,dis; while(scanf("%d",&m),m) { for(i=0;i<m;i++) scanf("%lf%lf",&g[i].x,&g[i].y); sort(g,g+m,cmp); dis=1e10; for(i=0;i<m;i++) { sum=1e10; for(j=i+1;j<m;j++) { if(DIS(g[i],g[j])<sum) sum=DIS(g[i],g[j]); else break; } if(sum<dis) dis=sum; } printf("%.2lf\n",dis/2); } return 0; }