Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Курсы ККДП
Дистрибутивы
Статьи
Ссылки


 
Вернуться
Тема: Быстрый ввод/вывод на Python (Задача 224)
1
  1  Меньшиков Фёдор Владимирович, 12 сентября 2022 г. 19:41:01
      Ограничение по памяти в 224-й задаче поднято с 16 до 128 Мбайт. Простой способ чтения теперь работает.
  2  Александр, 07 сентября 2022 г. 21:39:39
      Не уверен, что сделал так как надо, но программа пролезла еле-еле :)
Жаль нельзя посмотреть на другие лучшие решения

n, s = input(), input()
mx, mn = [], []
while len(s) > 20:
*L, s = s.split(' ', maxsplit=10000)
L = sorted([int(x) for x in L])
mn += L[:2]
mx += L[-3:]
L = sorted([int(x) for x in s.split()])
mn += L[:2]
mx += L[-3:]
mn.sort()
mx.sort()
print(max(mx[-3] * mx[-2] * mx[-1], mn[0] * mn[1] * mx[-1]))
  3  Хворых Павел, 07 сентября 2022 г. 7:45:22
      У метода split есть параметр maxsplit, который позволяет нарезать не всю строку разом, а какую-то часть. Решение со считыванием всей строки через input() и её нарезкой с параметром maxsplit=5000 успешно проходит на Python 3.9.
  4  Александр, 06 сентября 2022 г. 21:32:48
      Здесь ввод и обработка чисел кусочками по 50kb плюс сколько-то байт если последнее число разбилось посередине
  5  Александр, 06 сентября 2022 г. 21:30:26
      Есть ли где статья или пример быстрого ввода/вывода на Python ?
TLE из-за медленного ввода, или Memory limit из-за попытки сделать input().split() при 10^6 чисел
После многих попыток программа прошла, но кажется такой корявой:

import sys
n = int(sys.stdin.readline())
a = []
mx1, mx2, mx3 = -30001, -30001, -30001
mn1, mn2 = 30001, 30001

while True:
buf = sys.stdin.read(50000)
if len(buf) == 0: break
elif len(buf) == 50000 and buf[-1] != ' ':
add = ''
while True:
nxt = sys.stdin.read(1)
add = add + nxt
if nxt == '' or nxt == ' ': break
buf = buf + add

lst = list(map(int, buf.split()))
... а дальше уже решение

Можно ли ввод сделать лучше?
1

Чтобы оставить сообщение необходимо зарегистрироваться и авторизоваться!

Красноярский краевой Дворец пионеров, (c)2006 - 2026, ИНН 246305493507, E-mail: admin@acmp.ru