当前位置:   article > 正文

MT3016 竹鼠通讯

MT3016 竹鼠通讯

在真空中,一块无限平坦光滑绝缘不导热草地上有很多光滑且相同球形竹鼠,它们的坐标为(xi​,yi​)。竹鼠之间会通过脑电波联系彼此。现在请问相距最近两只竹鼠的直线距离分别是多少(所有竹鼠都在草地的第一象限)?

格式

输入格式:

第一行一个整数n;
接下来 n行每行两个非负浮点数,xi​,yi​,表示第 i个点的 X 坐标与 Y 坐标。xi​,yi​都精确到小数点后两位。

输出格式:

一行,一个浮点数,最短距离。精确到小数点后4位。

样例 1

输入:

4
0.0 0.0
0.0 1.0
1.0 0.0
1.0 1.0

输出:

1.0000
备注

其中: 0≤n≤10^5,竹鼠的坐标数据范围在int型范围内。并且可能会有重叠的竹鼠。

思路:模板题,最近点对问题,用分治解决。

即将区域分成  l----mid---r,即最短距离有三种情况:全在左边、全在右边、一个在左一个在右

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define INF 10000000001
  4. const int N = 1e5 + 7;
  5. struct node
  6. {
  7. double x, y;
  8. } a[N];
  9. int n, t[N];
  10. double ans = 0;
  11. bool cmp(node &a, node &b)//x,y升序
  12. {
  13. if (a.x < b.x)
  14. return true;
  15. else if (a.x == b.x && a.y < b.y)
  16. return true;
  17. else
  18. return false;
  19. }
  20. bool cmp2(int &i, int &j)
  21. {
  22. if (a[i].y < a[j].y) // 按y升序
  23. return true;
  24. else
  25. return false;
  26. }
  27. double dis(int i, int j)
  28. {
  29. double c = sqrt((a[i].x - a[j].x) * (a[i].x - a[j].x) + (a[i].y - a[j].y) * (a[i].y - a[j].y));
  30. return c;
  31. }
  32. double merge(int l, int r)
  33. {
  34. if (l == r)//重叠
  35. return INF;
  36. if (l == r - 1)
  37. return dis(l, r);
  38. int mid = (l + r) / 2;
  39. double d1 = merge(l, mid);
  40. double d2 = merge(mid + 1, r);
  41. ans = min(d1, d2); // 求全在左边和全在右边的最小值
  42. int k = 0;
  43. // 求一左一右的最小值
  44. for (int i = l; i <= r; i++)
  45. {
  46. if (fabs(a[i].x - a[mid].x) <= ans) // 将一左一右的编号写入t
  47. {
  48. t[k] = i;
  49. k++;
  50. }
  51. sort(t, t + k, cmp2);
  52. for (int i = 0; i < k; i++)
  53. {
  54. for (int j = i + 1; j < k && a[t[j]].y - a[t[i]].y < ans; j++)
  55. {
  56. ans = min(ans, dis(t[i], t[j]));
  57. }
  58. }
  59. }
  60. return ans;
  61. }
  62. int main()
  63. {
  64. cin >> n;
  65. for (int i = 0; i < n; i++)
  66. cin >> a[i].x >> a[i].y;
  67. sort(a, a + n, cmp);
  68. printf("%.4f", merge(0, n - 1));
  69. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/390953
推荐阅读
相关标签
  

闽ICP备14008679号