1.暴力
//按x第一关键词,按y第二关键词排,这样当if(a[j].x - a[i].x >= ans)时,后面的j一定不会比已有ans更优秀,疯狂剪枝。
#include<bits/stdc++.h>
using namespace std;
int n;
const int maxn = 100010;
double ans = 0x7fffffff;
struct node{
int x, y;
} a[maxn];
bool cmp(node p, node q){
if(p.x == q.x) return p.y < q.y;
return p.x < q.x;
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i].x >> a[i].y;
/*maxx = max(a[i].x, maxx);
maxy = max(a[i].y, maxy);*/
}
sort(a+1, a+n+1, cmp);
for(int i = 1; i <= n; i++)
for(int j = i+1; j <= n; j++){
if(a[j].x - a[i].x >= ans) break;
double now = sqrt(pow(a[i].x - a[j].x, 2) + pow(a[i].y - a[j].y, 2));
ans = min(now, ans);
}
printf("%.3lf\n", ans);
return 0;
}
2.分治
//切记sqrt()中要加(double)!!!!!
//3 1113333 223332 33333333 333333 23 23
#include<bits/stdc++.h>
using namespace std;
int n;
const int maxn = 100010;
const int inf = 0x3f3f3f3f;
struct node{
int x, y;
} a[maxn], t[maxn];
bool cmp(node p, node q){
if(p.x != q.x) return p.x < q.x;
return p.y < q.y;
}
bool cmpy(node p, node q){
return p.y < q.y;
}
double dis(node p, node q){
return sqrt((double)(p.x - q.x)*(p.x - q.x) + (double)(p.y - q.y)*(p.y - q.y));
}
double changsort(int x, int y){
double ans = 0x3fffffff;
if(y - x == 1) return inf;
if(y - x == 2) return dis(a[x], a[x+1]);
int m = x + (y-x)/2;
double d1 = changsort(x, m);
double d2 = changsort(m, y);
ans = min(d1, d2);
int cnt = 0;
for(int i = x; i <= m; i++)
if(fabs(a[i].x - a[m].x) < ans){
t[++cnt].x = a[i].x;
t[cnt].y = a[i].y;
}
sort(t+1, t+cnt+1, cmpy);
for(int i = 1; i <= cnt; i++)
for(int j = i+1; j <= cnt && abs(t[i].y - t[j].y) < ans; j++){
double d3 = dis(t[i], t[j]);
ans = min(ans, d3);
}
return ans;
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i].x >> a[i].y;
/*maxx = max(a[i].x, maxx);
maxy = max(a[i].y, maxy);*/
}
sort(a+1, a+n+1, cmp);
printf("%.3lf\n", changsort(1, n+1));
return 0;
}