1006暂时空着吧 先刷多点水题 自信心起来了在做。。
1007其实也有点难度 网上ac的代码大部分要用到二分的思想
题目(找最短距离的点)
但是也发现一个比较投机的代码
可能是hdu上的数据不全面才过的吧。。
#include <iostream>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
struct Point
{
double x,y;
} point[100001];
inline double dis(const Point &a ,const Point &b)
{
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y -b.y));
}
bool cmp(const Point &a ,const Point &b)
{
return a.x < b.x;
}
double getMin(int i,int n)
{
double d_tem = 99999,d;
for(int j = i + 1; j < n; j++)
{
d = dis(point[i],point[j]);
if( d < d_tem) d_tem = d;//首先记录i点和i + 1点的距离 t
else break;//i + 1点以后的点要是比 t 大 基本上就不用比较后面的点了
}
return d_tem;
}
int main()
{
int N,i;
double ans ,tem;
while(cin>>N,N)
{
ans = 99999999;
for(i = 0; i < N; i++)
{
cin>>point[i].x>>point[i].y;
}
sort(point,point + N,cmp);
for(i = 0; i < N; i++)
{
tem = getMin(i,N);
if(tem < ans)ans = tem;
}
cout<<fixed<<setprecision(2)<<ans/2.0<<endl;
}
return 0;
}
如图 如果按照上面的 getMin方法则算得最小值为d1 实际上d3是最小的
如果这样的话,进一步算得话 在第二个点和第三个点的距离貌似要小于 d3 于是新的最小距离会覆盖掉上一步忽略的d3
不知道能不能证明这样查找的就一定是最短距离
另外听说还有一个KD树和这个最短距离有关效率很高的样子 先MARK一下