Top.Mail.Ru
Ответы

Проблемка с задачей на асмр

написал код, вроде работает, однако я использовал костыль, да и на собственном тесте 3 50 10 вместо 30 выдаёт 50 как наименьшее. Преподаватель сказал, что главное это использование бинарного поиска:
вот код:
#include <iostream>
#include <algorithm>

int main() {
int N, x, y;
using namespace std;
cin >> N >> x >> y;
int L =max(x, y), R = max(L, min(x, y) * N), M, k;
while (L < R) {
M = (L + R) / 2;
if ((M / x + M / y) >= N) {
R = M;
}
else {
L = M + 1;
}
}
if (x == 1 && y == 1 && N > 1) {
cout << L + 1;
return 0;
} //костыль
cout << L;


return 0;
}
подскажите что не так, буду очень сильно благодарен. Вот задача: https://acmp.ru/index.asp?main=task&id_task=267
если ссылка будет битой название задачи: ксерокопии

По дате
По рейтингу
Аватар пользователя

Задача: Ксерокопии
Вам нужно найти минимальное время, необходимое для создания копий документа, используя два ксерокса, один из которых копирует лист за секунд, а другой — за секунд.
Решение с использованием бинарного поиска
Ваш код почти правильный, но есть несколько моментов, которые можно улучшить. Давайте исправим ваш код:
Убедимся, что начальное значение и установлены правильно.
Убедимся, что проверка количества копий корректна.
Исправленный код:

1234567891011121314151617181920212223242526272829303132
 #include <iostream> 
#include <algorithm> 
 
int main() { 
    using namespace std; 
    int N, x, y; 
    cin >> N >> x >> y; 
 
    // Если N == 1, то минимальное время - это минимальное время одного из ксероксов 
    if (N == 1) { 
        cout << min(x, y); 
        return 0; 
    } 
 
    // Инициализация границ бинарного поиска 
    int L = min(x, y); 
    int R = max(x, y) * N; 
    int M, k; 
 
    while (L < R) { 
        M = (L + R) / 2; 
        // Проверяем, сколько копий можно сделать за M секунд 
        if ((M / x + M / y) >= N - 1) { 
            R = M; 
        } else { 
            L = M + 1; 
        } 
    } 
 
    cout << L + min(x, y); // Добавляем время для первой копии 
    return 0; 
} 

Пояснения:
Инициализация границ: Начальное значение установлено в минимальное время одного из ксероксов, а — в максимальное время, умноженное на .
Проверка количества копий: В условии if ((M / x + M / y) >= N - 1) мы проверяем, можно ли сделать копий за секунд, так как первая копия делается за минимальное время одного из ксероксов.
Вывод результата: В конце мы добавляем минимальное время одного из ксероксов к , чтобы учесть время для первой копии.
Этот код должен корректно работать для всех входных данных и использовать бинарный поиск для нахождения минимального времени.