vadimk772336

Untitled

Oct 9th, 2021 (edited)
569
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <cmath>
  4. using namespace std;
  5.  
  6. struct dot
  7. {
  8.     int x;
  9.     int y;
  10.     double center;
  11. };
  12.  
  13. void simpleSort(dot* dots, int l, int r)
  14. {
  15.     dot buff;
  16.     int j;
  17.  
  18.     for (int i = l + 1; i < r + 1; ++i)
  19.     {
  20.         j = i;
  21.         while (j > l && dots[j - 1].center > dots[j].center)
  22.         {
  23.             buff = dots[j - 1];
  24.             dots[j - 1] = dots[j];
  25.             dots[j] = buff;
  26.             j--;
  27.         }
  28.     }
  29. }
  30.  
  31. void merge(dot* dots, int l, int mid, int r)
  32. {
  33.     int ls = 0, rs = 0;
  34.     dot result[r - l + 1];
  35.  
  36.     {
  37.         while ((l + ls < mid + 1) && (mid + rs < r))
  38.         {
  39.             if (dots[l + ls].center < dots[mid + rs + 1].center)
  40.             {
  41.                 result[ls + rs] = dots[l + ls];
  42.                 ls++;
  43.             }
  44.             else
  45.             {
  46.                 result[ls + rs] = dots[mid + 1 + rs];
  47.                 rs++;
  48.             }
  49.         }
  50.     }
  51. }
  52.  
  53. void mergeSort(dot* dots, int l, int r)
  54. {
  55.     if (r - l <= 1)
  56.         return;
  57.  
  58.     if ((r - l) < 12)
  59.     {
  60.         simpleSort(dots, l, r);
  61.         return;
  62.     }
  63.  
  64.     int mid = (l + r) / 2;
  65.     mergeSort(dots, l, mid);
  66.     mergeSort(dots, mid + 1, r);
  67.     merge(dots, l, mid, r);
  68. }
  69.  
  70.  
  71. bool is_contain_k(double radius, dot* dots, int n, int k)
  72. {
  73.  
  74.     std::queue<int> dots_in_disk;
  75.     int count;
  76.     double center;
  77.     double x_, diff;
  78.     double left;
  79.  
  80.     int centers[n];
  81.     for (int i = 0; i < n; ++i)
  82.     {
  83.         center = -5000;
  84.         if ((radius * radius - dots[i].y * dots[i].y) >= 0)
  85.         {
  86.  
  87.             x_ = sqrt(radius * radius - dots[i].y * dots[i].y) + center;
  88.             diff = dots[i].x - x_;
  89.             center += diff;
  90.             dots[i].center = center;
  91.         }
  92.         else
  93.         {
  94.             cout << "точка выше ниже окр" << (radius * radius) << " " << dots[i].y * dots[i].y
  95.                  << endl;
  96.             dots[i].center = 5000;
  97.         }
  98.     }
  99.     mergeSort(dots, 0, n - 1);
  100.  
  101.     if (radius < 6)
  102.     {
  103.         cout << "Координаты центров окр при радиусе " << radius << endl;
  104.         for (int i = 0; i < n; ++i)
  105.             cout << dots[i].center << " ";
  106.         cout << endl << endl;
  107.     }
  108.  
  109.     dots_in_disk.push(0);
  110.     count = 1;
  111.     double x, y;
  112.     for (int i = 1; i < n; ++i)
  113.     {
  114.         if (dots[i].center < 1000 + radius)
  115.         {
  116.             diff = dots[i].center - center;
  117.             left = center - radius;
  118.             x = dots[dots_in_disk.front()].x;
  119.             y = dots[dots_in_disk.front()].y;
  120.  
  121.             while (
  122.                 count > 0 && ((x - center - diff) * (x - center - diff) + y * y > radius * radius))
  123.             {
  124.                 count--;
  125.                 dots_in_disk.pop();
  126.                 x = dots[dots_in_disk.front()].x;
  127.                 y = dots[dots_in_disk.front()].y;
  128.             }
  129.             center += diff;
  130.             left += diff;
  131.             dots_in_disk.push(i);
  132.             count++;
  133.  
  134.             if (count == k)
  135.             {
  136.                 if (radius < 6)
  137.                     std::cout << "Прошло, центр:" << center << std::endl;
  138.                 return true;
  139.             }
  140.         }
  141.     }
  142.     return false;
  143. }
  144.  
  145. double binary_search(dot* dots, int n, int k)
  146. {
  147.     double max_r = 1420;
  148.     double min_r = 0;
  149.     double radius;
  150.  
  151.     while (max_r - min_r > 1e-4 && max_r >= min_r)
  152.     {
  153.         radius = (max_r + min_r) / 2;
  154.         cout << "aa------------------------aa" << endl;
  155.         if (is_contain_k(radius, dots, n, k))
  156.         {
  157.             max_r = radius;
  158.             if (max_r < 8)
  159.             {
  160.                 std::cout << "прошолло обновлённое значение min_r,max_r"
  161.                           << "  " << min_r << "  " << max_r << " \n";
  162.                 cout << "bb------------------------bb" << endl;
  163.             }
  164.         }
  165.         else
  166.         {
  167.             min_r = radius + 1e-4;
  168.         }
  169.     }
  170.  
  171.     return max_r;
  172. }
  173.  
  174. int main()
  175. {
  176.     int n, k;
  177.  
  178.     /*
  179.     std::cin >> n;
  180.     std::cin >> k;
  181.     dot dots[n] = {};
  182.     for (int i=0; i <n; ++i) {
  183.         std::cin >> dots[i].x;
  184.         std::cin >> dots[i].y;
  185.     }
  186.     */
  187.     cout << "dsf";
  188.     dot dots[n] = { { 0, 1 }, { 2, 1 } };
  189.     // dot dots[n] = { { 0, 5 }, { 3, 4 }, { -4, -3 } };
  190.     n = 2;
  191.     k = 2;
  192.     // double radius = 6;
  193.  
  194.     double res = binary_search(dots, n, k);
  195.     std::cout << res;
  196.  
  197.     return 0;
  198. }
  199.  
Add Comment
Please, Sign In to add comment