Помогите решить задачу на бинарный поиск

Я решала следующую задачу: введите сюда описание изображения

Написала такой код, и наивно надеялась, что он пройдёт по времени:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    long long n, x, y, ans = 0, nado = 0;
    cin >> n >> x >> y;
    n -= min(x, y);
    ans += min(x, y);
    while (n > 0) {
        if (x != y) {
            if (max(x, y) % min(x, y) != 0) {
                n -= (max(x, y) / min(x, y) + 1);
                ans += max(x, y);
                nado += max(x, y) / min(x, y);
                if (nado == min(x, y)) {
                    n--;
                    nado = 0;
                    ans += nado;
                }
            }
            else {
                if (n - (max(x, y) / min(x, y) + 1) >= 0) {
                n -= max(x, y) / min(x, y) + 1;
                ans += max(x, y);
                }
                else {
                    ans += n;
                    n = 0;
                }
            }
        }
        else {
            ans += x;
            n -= 2;
        }
    }
    cout << ans;
    return 0;
}

Но получила превышение времени исполнения. Мне подсказали, что здесь можно решить бинарным поиском, однако я не понимаю, при чем он тут. Пожалуйста, не пишите что здесь просто бинарный поиск по ответу - от этого понятнее не станет.


Ответы (1 шт):

Автор решения: MBo
  1. Сделаем так, чтобы x <= y, чтоб не возиться с min/max

  2. Для N=1 возвращаем x, иначе N-=1 (сделали копию)

  3. Максимально возможное время - tmax = N*x, возьмём его в качестве верхней границы

  4. Бинарным поиском (std::lower_bound) найдём минимальное значение времени t для удовлетворения неравенства (деление в целых числах)

    t/x + t/y >= N
    
  5. Добавляем x (из пункта 2)

Пример:

 n=15, x=3, y=5
 n = 15-1=14
 t/3+t/5 >=14
 t = 27
 T = t + x = 30 (10 копий на первом аппарате, 5 на втором)
   
→ Ссылка