最近点对问题,可以用分治算法nlogn解出,但是实在不愿费劲了,直接暴力,注意下剪枝159ms飘过。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
struct test{
double x,y;
}c[10010];
bool cmp(struct test a,struct test b)
{
return a.x<b.x;
}
int main()
{
int n;
while(cin>>n&&n){
for(int i=1;i<=n;i++) cin>>c[i].x>>c[i].y;
double ans=80000;
sort(c+1,c+n+1,cmp);
for(int i=1;i<=n;i++){
double dx,dy;
for(int j=i+1;j<=n&&(dx=c[j].x-c[i].x)<ans;j++){
if(dx>=10000) continue;
if((dy=c[j].y-c[i].y)>=ans) continue;
if(dy>=10000) continue;
ans=min(ans,sqrt(dy*dy+dx*dx));
}
}
if(ans-10000>0.0000005) printf("INFINITY\n");
else printf("%.4lf\n",ans);
}
return 0;
}