Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

1 1 Ученик (168), на голосовании 3 месяца назад
написал код, вроде работает, однако я использовал костыль, да и на собственном тесте 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
если ссылка будет битой название задачи: ксерокопии
Голосование за лучший ответ
Минирсику писику Гуру (2893) 4 месяца назад
Задача: Ксерокопии
Вам нужно найти минимальное время, необходимое для создания копий документа, используя два ксерокса, один из которых копирует лист за секунд, а другой — за секунд.
Решение с использованием бинарного поиска
Ваш код почти правильный, но есть несколько моментов, которые можно улучшить. Давайте исправим ваш код:
Убедимся, что начальное значение и установлены правильно.
Убедимся, что проверка количества копий корректна.
Исправленный код:
 #include  
#include

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) мы проверяем, можно ли сделать копий за секунд, так как первая копия делается за минимальное время одного из ксероксов.
Вывод результата: В конце мы добавляем минимальное время одного из ксероксов к , чтобы учесть время для первой копии.
Этот код должен корректно работать для всех входных данных и использовать бинарный поиск для нахождения минимального времени.
1 1Ученик (168) 4 месяца назад
Огромнейше Вам Спасибо за объяснение.
Минирсику писику Гуру (2893) 1 1, Пользуйтесь, поможет в будущем с решением многих вопросов. https://www.coze.com/store/bot/7380916141339738117?bid=6cvmnk2uo2g05&panel=1 Задаете вопрос, он решает. Это он решил ваш вопрос.
Похожие вопросы