LINUX.ORG.RU

История изменений

Исправление xionovermazes, (текущая версия) :

Такое в мыслях витало, но вы хорошо выразили. Правда почему именно 5000 я не понял. Я это сейчас вижу так:

  1. Соритируем a,b.
  2. Берем любую дробь m, допустим по середине a[n/2] / b[n/2].
  3. Введем число d, которое будет означать сколько дробей менее m.
  4. Проходимся бинарным поиском внутри каждой группы с одинаковым знаменателем. И для каждой группы находим сколько значений менее m. Назовем это число для каждой группы n_i.
  5. Очевидно, что если d > c(запрос), то нужно число большее m, в противном случае, нужно число большее m.
  6. Для каждой группы имеем по одному кандидату. По сути это либо n_i либо n_i-1. В зависимости от условия 4.
  7. Имея n кандидатов, выбираем тот который ближе всего находится к m. m = new_candidate.
  8. Повторяем шаги 2-6 пока d != c.

Я отпишу реализацию чуть позже. В реализации нужно ещё аккуратно с индексами кандидатов, чтобы за границы не уйти.

n_i - 1

Исходная версия xionovermazes, :

Такое в мыслях витало, но вы хорошо выразили. Правда почему именно 5000 я не понял. Я это сейчас вижу так:

  1. Соритируем a,b.
  2. Берем любую дробь m, допустим по середине a[n/2] / b[n/2].
  3. Введем число d, которое будет означать сколько дробей менее m.
  4. Проходимся бинарным поиском внутри каждой группы с одинаковым знаменателем. И для каждой группы находим сколько значений менее m. Назовем это число для каждой группы n_i.
  5. Очевидно, что если d > c(запрос), то нужно число большее m, в противном случае, нужно число большее m.
  6. Для каждой группы имеем по одному кандидату. По сути это либо n_i либо n_i-1. В зависимости от условия 4.
  7. Имея n кандидатов, выбираем тот который ближе всего находится к m. m = new_candidate.
  8. Повторяем шаги 2-6 пока d != c.

Я отпишу реализацию чуть позже.