Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'pry'
- module Sol
- @@min_radius = Float::INFINITY
- @@min_center = []
- def self.min_radius
- @@min_radius
- end
- def self.min_center
- @@min_center
- end
- def self.distance(x1, y1, x2, y2)
- Math.sqrt((x1 - x2)**2 + (y1 - y2)**2)
- end
- def self.count_points_in_circle(x, y, r, points)
- count = 0
- points.each do |px, py|
- count += 1 if distance(x, y, px, py) <= r
- end
- count
- end
- def self.find_min_radius(points)
- n = points.length
- find_min_radius_recursive(points, n, 0, 1)
- end
- def self.find_min_radius_recursive(points, n, i, j)
- if i >= n || j >= n
- return
- end
- x1, y1 = points[i]
- x2, y2 = points[j]
- cx = (x1 + x2) / 2.0
- cy = (y1 + y2) / 2.0
- radius = distance(x1, y1, cx, cy)
- count = count_points_in_circle(cx, cy, radius, points)
- if count >= n / 2 && radius < @@min_radius
- @@min_radius = radius
- @@min_center = [cx.to_i, cy.to_i]
- end
- find_min_radius_recursive(points, n, i, j + 1)
- find_min_radius_recursive(points, n, i + 1, j)
- @@min_center
- @@min_radius
- end
- end
- # Чтение координат особей
- points = []
- # n = 8
- # Чтение количества особей
- n = $stdin.gets.to_i
- n.times do
- x, y = $stdin.gets.chomp.split.map(&:to_i)
- points << [x, y]
- end
- # Поиск минимального радиуса и его центра
- radius = Sol.find_min_radius(points)
- min_center = Sol.min_center
- min_radius = Sol.min_radius
- if min_radius.to_i == min_radius
- min_radius = min_radius.to_i
- else
- min_radius
- end
- # Вывод результатов
- # puts "#{radius.to_s} #{min_center} #{min_radius}"
- puts "#{min_center[0]} #{min_center[1]} #{min_radius}"
- #ВД
- # 8
- # 4 3
- # 3 4
- # -3 4
- # -4 3
- # -4 -3
- # -3 -4
- # 3 -4
- # 4 -3
- # Вывод
- # 0 3 4
- # ВД
- # 4
- # 1.5 1.5
- # 1.5 -1.5
- # -1.5 -1.5
- # -1.5 1.5
- # Вывод
- # 1 0 1
- # Решить проблему с float, пересмотреть best practice ruby
- # benchmark sol
- https://github.com/ruby/benchmark
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement