这道题我虽然不会,但是看了大佬的代码并运行,但!!是为什么我的运行时间要多200+ms!!!!
难道是上天嫉妒我的英才 ?? 还是人傻自带大常数??
利用的是归并的思想,最小的距离无非是左半区,或者是右半区, 或者是横跨左右半区。
PS: 利用排序做了一下优化
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 100010;
const double INF = 1e9 + 100;
struct E
{
double x, y;
}point[N];
bool cmpx(E a, E b)
{
return a.x < b.x;
}
bool cmpy(E a, E b)
{
return a.y < b.y;
}
double dis(E a, E b)
{
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double get_distance(int l, int r)
{
if(l + 1 == r) return dis(point[l], point[r]);
else if(l == r) return INF;
vector<E> ls, rs;
int mid = l + r >> 1;
double d = min(get_distance(l, mid), get_distance(mid + 1, r));
//cout << d << endl;
for(int i = l; i <= mid ; i ++)
{
if(fabs(point[mid].x - point[i].x) <= d) ls.push_back(point[i]);
}
for(int i = mid + 1; i <= r; i ++)
{
if(fabs(point[i].x - point[mid].x) <= d) rs.push_back(point[i]);
}
sort(ls.begin(), ls.end(), cmpy);
sort(rs.begin(), rs.end(), cmpy);
int pos = 0;
for(int i = 0; i < ls.size(); i ++)
{
for(int j = pos; j < rs.size(); j ++)
{
if(ls[i].y - rs[j].y > d) pos = j + 1;
if(fabs(ls[i].y - rs[j].y) < d)
{
double t = dis(ls[i], rs[j]);
if(d > t) d = t;
}
if(fabs(ls[i].y - rs[i].y) > d) break;
}
}
return d;
}
int main()
{
int n;
while(cin >> n && n)
{
for(int i = 0; i < n ; i ++)
{
double a, b; scanf("%lf %lf", &a, &b);
point[i] = {a, b};
}
sort(point, point + n, cmpx);
double ans = get_distance(0, n - 1);
printf("%.2lf\n", (ans) / 2);
}
return 0;
}