0. Вводные замечания
Все нижесказанное относится к python версии 3.x. Вторая версия питона имеет существенные отличия в синтаксисе.
1. Ввод данных
На олимпиадах часто требуется вводить информацию из текстового файла. Это делается так:
fin = open("a.in") # fin -
переменная, которая будет связана с входным файлом, a.in -
имя входного файла.
s = fin.read() #
читает всё содержимое файла в одну строку. Эта строка будет выглядеть примерно
так:
# "Hello!\nHow are you?\nWhat is your
name?\n", где \n -
символ перевода строки
или
t = fin.read().split('\n') #
создаст список строк вида ['Hello!', 'How are you?',
'What is your name?'] -
# каждая строка
соответствует строке входного файла
read() - самая эффективная из всех команд для чтения из файла (то есть чтение с использованием этой команды занимает меньше всего времени).
Если вам нужно считать небольшое количество строк, можно также воспользоваться командой readline(), которая читает одну строку. Не забудьте, что она сохраняет символ перевода строки в считанной строке (то есть строка будет выглядеть примерно так: 'Hello!\n'). Чтобы избавиться от перевода строки, можно написать: readline().strip().
Если ввод данных осуществляется с клавиатуры, то можно пользоваться командой input() для считывания небольшого объема данных или считывать из стандартного потока ввода также, как и из файла:
from sys import stdin
s = stdin.read() # stdin - название стандартного потока
ввода, по умолчанию туда посылается весь ввод с клавиатуры.
2. Вывод данных
Вывод данных на экран осуществляется командой print(). Для вывода данных в файл создадим файловую переменную, открыв файл для записи и воспользуемся той же функцие print:
fout = open("a.out", "w") # w
- признак открытия файла для записи (write),
при этом старое содержимое стирается,
# а если файл не
существует, то создается новый файл.
print(text, file = fout)
При выводе большого объема данных эффективнее превратить их в одну строку командой join, и вывести разом, нежели выводить их последовательно в цикле. Например, если t - список чисел, которые нужно вывести через пробел, можно написать так:
print(" ".join(map(str, t)) # преобразуем список чисел в список строк и склеиваем его "через пробел"
Если же нужно, скажем, вывести список строк
s, каждую с новой строки, это делается так:
print("\n".join(s))
Никогда не складывайте строки, используя + или +=: всегда используйте join!
3. Использование генераторов
Для заполнения список (равно как и других контейнеров) гораздо эффективнее использовать генераторы, нежели циклы. Например, такой код:
s = [0] * 100000
for i in range(100000):
s[i] = i * i
будет выполняться гораздо дольше, нежели:
s = [i * i for i in range(100000)]
4. Используйте стандартные функции
Например такие, как sort для сортировки, или функции из модуля bisect для бинарного поиска в массиве - они написаны на C с использованием эффективных алгоритмов, а потому работают очень быстро.
5. Используйте множества и словари
Они реализованы очень эффективно, и позволяют быстро выполнять все необходимые операции по добавлению, поиску, изменению и удалению элементов.
6. Проверяйте, сколько памяти использует ваша программа в худшем случае
Питоновские типы данных обычно используют гораздо больше памяти, чем анаалогичные типы в Си или Паскале. Поэтому задача, которую жюри подготовило на Си, может не пройти ограничение по памяти. Для того. чтобы посмотреть, сколько памяти использует ваша программа, можно запустить ее на максимальном примере, и воспользоваться, например, диспетчером задач.
При необходимости "сэкономить" можно использовать один и тот же массив в разных целях, скажем, вначале для считывания входных данных, а затем, когда входные данные станут не нужны - для хранения результата.