HDOJ 1007(T_T)
就是求平面上N点间的最短距离,但是没过;老是Compilation Error,但其实是可以运行的啊
人挫没办法!
以下是代码:
人挫没办法!
以下是代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <iomanip>
#define MM 100020
using namespace std;
struct Note
{
double x;
double y;
}pt[MM];
int _sort1[MM];
int _sort2[MM];
double min(double& x,double& y)
{
if(x-y>=1e-6)
return y;
else return x;
}
int cmp_x(const void *a,const void *b)
{
if(((Note*)a)->x>((Note*)b)->x) return 1;
else return -1;
}
int cmp_y(const void *a,const void *b)
{
if(pt[(*(int*)a)].y>pt[(*(int*)b)].y) return 1;
else return -1;
}
double distan(Note a,Note b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double neardis(int first,int ends)
{
if(ends-first==1) return distan(pt[first],pt[ends]);
if(ends-first==2) return min(min(distan(pt[first],pt[first+1]),distan(pt[first],pt[ends])),distan(pt[first+1],pt[ends]));
int mid=(first+ends)/2;
double dis1=neardis(first,mid);
double dis2=neardis(mid+1,ends);
double dota=min(dis1,dis2);
int _end1=0;
int _end2=0;
for(int i=mid;i>first&&distan(pt,pt[mid])<=dota;i--)
{
_sort1[_end1++]=i;
}
for(int i=mid+1;i<ends&&distan(pt,pt[mid])<=dota;i++)
{
_sort2[_end2++]=i;
}
qsort(_sort1,_end1,sizeof(_sort1[0]),cmp_y);
qsort(_sort2,_end2,sizeof(_sort2[0]),cmp_y);
double min_dis=dota;
for(int i=0;i<_end1;i++)
{
for(int j=0;j<_end2;j++)
{
if(fabs(pt[_sort2[j]].y-pt[_sort1].y)-dota>1e-6) continue;
//网上的6个点什么的就是在这里用到的防止特殊情况下超时,鸽?///笼原理什么的
dota=distan(pt[_sort1],pt[_sort2[j]]);
min_dis=min(min_dis,dota);
}
}
return min_dis;
}
int main()
{
int n;
cin>>n;
while(n)
{
for(int i=0;i<n;i++)
cin>>pt.x>>pt.y;
qsort(pt,n,sizeof(pt[0]),cmp_x);
cout<<fixed<<setiosflags(ios::showpoint)<<setprecision(2)<<neardis(0,n-1)/2<<endl;
cin>>n;
}
return 0;
}
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#define MM 100010
#define eps 1e-6
using namespace std;
struct Note
{
double x;
double y;
}pt[MM];
int Y_sort1[MM];
int Y_sort2[MM];
double min(double& a,double& b)
{
if(a-b>eps) return b;
else return a;
}
double distan(Note &a,Note &b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int cmp_x(const void *a,const void *b)
{
if(((Note*)a)->x-((Note*)b)->x>eps) return 1;
else return -1;
}
int cmp_y(const void *a,const void *b)
{
if(pt[*(int*)a].y-pt[*(int*)b].y>eps) return 1;
else return -1;
}
double neardis(int _first,int _end)
{
if(_end-_first==1) return distan(pt[_first],pt[_end]);
if(_end-_first==2) return min(min(distan(pt[_first],pt[_end]),distan(pt[_first+1],pt[_end])),distan(pt[_first],pt[_first+1]));
int _mid=(_first+_end)/2;
double dis1=neardis(_first,_mid);
double dis2=neardis(_mid+1,_end);
double dota=min(dis1,dis2);
int sort1=0;
int sort2=0;
for(int i=_first;i<=_mid&&(distan(pt,pt[_mid])-dota)<eps;i++)
{
Y_sort1[sort1++]=i;
}
for(int i=_mid+1;i<=_end&&(distan(pt,pt[_mid])-dota)<eps;i++)
{
Y_sort2[sort2++]=i;
}
qsort(Y_sort1,sort1,sizeof(Y_sort1[0]),cmp_y);
qsort(Y_sort2,sort2,sizeof(Y_sort2[0]),cmp_y);
for(int i=0;i<sort1;i++)
{
for(int j=0;j<sort2&&fabs(pt[Y_sort2[j]].y-pt[Y_sort1].y)<=dota;j++)
{
double dota2=distan(pt[Y_sort2[j]],pt[Y_sort1]);
dota=min(dota,dota2);
}
}
return dota;
}
int main()
{
int n;
cin>>n;
while(n!=0)
{
for(int i=0;i<n;i++)
{
cin>>pt.x>>pt.y;
}
qsort(pt,n,sizeof(pt[0]),cmp_x);
cout<<fixed<<setiosflags(ios::showpoint)<<setprecision(2)<<neardis(0,n-1)/2<<endl;
cin>>n;
}
return 0;
}