На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение



Сообщение: 1
ссылка на сообщение  Отправлено: 02.10.22 21:48. Заголовок: Задача 4741, слишком долго считается


Добрый день.
Пытаюсь решить задачу https://kpolyakov.spb.ru/school/ege/gen.php?action=viewTopic&topicId=4741
Для анализа нагрузки сервера для каждого запроса в журнал записываются время начала и время завершения его обработки (в миллисекундах от момента начала исследований). Если начальное время равно 0, запрос начал обрабатываться до начала исследований, если конечное время равно 0, то обработка запроса закончилась после окончания исследований. Необходимо определить наибольшее количество запросов, которые сервер обрабатывал одновременно в течение суток, начиная с момента K, и суммарное время, в течение которого обрабатывалось это максимальное количество запросов.
Входные данные представлены в файле 26-66.txt следующим образом. Первая строка входного файла содержит количество записей N и время K. Каждая из следующих N строк содержит два целых числа: время начала и время завершения обработки одного запроса (в миллисекундах).
Запишите в ответе два числа: наибольшее количество запросов, которые сервер обрабатывал одновременно в течение указанных суток, и суммарное время, в течение которого обрабатывалось это максимальное количество запросов.



Мое решение(на питоне):
1. В лоб.
Всего есть около 52 тысяч записей в файле.
Считываю в массив данные попутно ищу самое позднее время окончания процесса(но не ноль).
Массив выглядит вот так:
[[0, 125], [123, 3456], [12345, 0]], т.е. записываю время начала и конца процесса.
Затем создаю массив заполненный нулями. Каждый элемент массива - милисекунда. Если в эту миллисекунду выполняется процесс, то увеличиваю элемент на 1.
Иду по массиву процессов и для каждого процесса инкрементирую соответствующие элементы массива милисекунд.

Затем остается пройтись по массиву милисекунд и найти максимальное значение в нем и сколько раз подряд оно встретилось.


Но этот алгоритм работает слишком долго. Потому что время начала процессов и их окончания находятся где-то между 1 200 000 000 и 1 300 000 000.
Получается я делаю 50 000 * 1 300 000 000 итераций (порядка 65 триллионов).

Затем я решил схитрить. Я нашел самое раннее время начала выполнения процесса. И вычел его из времен всех процессов.
Все равно как минимум первые 1 200 000 000 секунд ничего не происходит.
Получилось, что все процессы теперь умещаются в отрезке времени от 0 до примерно 92 млн милисекунд.

И запустил еще раз. Все еще невероятно долго выполнение.

Давайте оптимизируем еще раз:
при чтении файла не буду записывать в массив процессов те процессы, которые закончились раньше, чем время, начиная с которого надо считать их максимальное количество одновременно запущенных.

Все еще долго, примерно на 76 часов выполнения.

Явно я делаю что-то нет.


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

Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 2 [только новые]


Администратор




Сообщение: 3715
ссылка на сообщение  Отправлено: 04.10.22 13:32. Заголовок: Это задача 26-66 из ..


Это задача 26-66 из основного сборника. Здесь есть решения всех 26-х задач на Python.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 2
ссылка на сообщение  Отправлено: 04.10.22 20:32. Заголовок: Спасибо!..


Спасибо!

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 784
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет