Помогите решить задачу на бинарный поиск
Написала такой код, и наивно надеялась, что он пройдёт по времени:
#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
→ Ссылка
Сделаем так, чтобы
x <= y, чтоб не возиться с min/maxДля
N=1возвращаемx, иначеN-=1(сделали копию)Максимально возможное время -
tmax = N*x, возьмём его в качестве верхней границыБинарным поиском (
std::lower_bound) найдём минимальное значение времениtдля удовлетворения неравенства (деление в целых числах)t/x + t/y >= NДобавляем 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 на втором)
