Advertisement
Cr9Co0

sol_3

Jul 3rd, 2023 (edited)
1,577
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.08 KB | Software | 0 0
  1. require 'pry'
  2.  
  3. module Sol
  4.   @@min_radius = Float::INFINITY
  5.   @@min_center = []
  6.  
  7.   def self.min_radius
  8.     @@min_radius
  9.   end
  10.  
  11.   def self.min_center
  12.     @@min_center
  13.   end
  14.  
  15.   def self.distance(x1, y1, x2, y2)
  16.     Math.sqrt((x1 - x2)**2 + (y1 - y2)**2)
  17.   end
  18.  
  19.   def self.count_points_in_circle(x, y, r, points)
  20.     count = 0
  21.     points.each do |px, py|
  22.       count += 1 if distance(x, y, px, py) <= r
  23.     end
  24.     count
  25.   end
  26.  
  27.   def self.find_min_radius(points)
  28.     n = points.length
  29.  
  30.     find_min_radius_recursive(points, n, 0, 1)
  31.   end
  32.  
  33.   def self.find_min_radius_recursive(points, n, i, j)
  34.     if i >= n || j >= n
  35.       return
  36.     end
  37.  
  38.     x1, y1 = points[i]
  39.     x2, y2 = points[j]
  40.     cx = (x1 + x2) / 2.0
  41.     cy = (y1 + y2) / 2.0
  42.     radius = distance(x1, y1, cx, cy)
  43.  
  44.     count = count_points_in_circle(cx, cy, radius, points)
  45.     if count >= n / 2 && radius < @@min_radius
  46.       @@min_radius = radius
  47.       @@min_center = [cx.to_i, cy.to_i]
  48.     end
  49.  
  50.     find_min_radius_recursive(points, n, i, j + 1)
  51.     find_min_radius_recursive(points, n, i + 1, j)
  52.  
  53.     @@min_center
  54.     @@min_radius
  55.   end
  56. end
  57.  
  58. # Чтение координат особей
  59. points = []
  60.  
  61. # n = 8
  62.  
  63. # Чтение количества особей
  64. n = $stdin.gets.to_i
  65.  
  66. n.times do
  67.    x, y = $stdin.gets.chomp.split.map(&:to_i)
  68.    points << [x, y]
  69. end
  70.  
  71. # Поиск минимального радиуса и его центра
  72.  
  73. radius = Sol.find_min_radius(points)
  74. min_center = Sol.min_center
  75. min_radius = Sol.min_radius
  76.  
  77. if min_radius.to_i == min_radius
  78.   min_radius = min_radius.to_i
  79. else
  80.   min_radius
  81. end
  82. # Вывод результатов
  83. # puts "#{radius.to_s} #{min_center} #{min_radius}"
  84. puts "#{min_center[0]} #{min_center[1]} #{min_radius}"
  85.  
  86. #ВД
  87. # 8
  88. # 4 3
  89. # 3 4
  90. # -3 4
  91. # -4 3
  92. # -4 -3
  93. # -3 -4
  94. # 3 -4
  95. # 4 -3
  96. # Вывод
  97. # 0 3 4
  98.  
  99. # ВД
  100. # 4
  101. # 1.5 1.5
  102. # 1.5 -1.5
  103. # -1.5 -1.5
  104. # -1.5 1.5
  105. # Вывод
  106. # 1 0 1
  107. # Решить проблему с float, пересмотреть best practice ruby
  108. # benchmark sol
  109. https://github.com/ruby/benchmark
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement