给你n个点,让你求最近的两个点的距离是多少.
思路:
这个题目我没思路,我在网上看的是什么分治 + 鸽巢原理,分治我知道,鸽巢原理我也知道,但是这个题目就是没有证明出来他和鸽巢原理有jm关系,总之就是先以x或者y优先sort一下,然后每次枚举每个相邻点的附近5个就行了(加自己一共六个),而且这个题目的前提好像还是什么数据必须是随机产生的吧,ac可以,但不明白..
#include<stdio.h> #include<math.h> #include<algorithm> #define N 100000 + 100 using namespace std; typedef struct { double x ,y; }NODE; NODE node[N]; bool camp(NODE a ,NODE b) { return a.y < b.y || a.y == b.y && a.x < b.x; } double dis(NODE a ,NODE b) { return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); } int main () { int n ,i ,j; while(~scanf("%d" ,&n) && n) { for(i = 1 ;i <= n ;i ++) scanf("%lf %lf" ,&node[i].x ,&node[i].y); sort(node + 1 ,node + n + 1 ,camp); double min = 1000000000; for(i = 1 ;i <= n ;i ++) for(j = i + 1 ;j <= i + 5 && j <= n ;j ++) { double now = dis(node[i] ,node[j]); if(min > now) min = now; } printf("%.2lf " ,sqrt(min)/2); } return 0; }