💡
Programação Competitiva
  • Treinamento OBI
  • C++
    • Complexidade de Algoritmos
    • Entradas e saídas
    • Conjuntos
    • Crivo de Eratóstenes
    • Algoritmo de Euclides
    • Soma Máxima em um Intervalo
    • Busca binária
    • Manipulação de bits
    • Algoritmo guloso
  • Python
    • Complexidade de Algoritmos
    • Entradas e saídas
    • Conjuntos
    • Crivo de Eratóstenes
    • Algoritmo de Euclides
    • Soma Máxima em um Intervalo
    • Busca binária
    • Manipulação de bits
    • Algoritmo guloso
    • Filas e Pilhas
    • Filas de prioridade
    • Grafos
    • Union-Find
    • Menor caminho - 1
    • Menor caminho - 2
    • Algoritmo de Kruskal
  • Créditos
Powered by GitBook
On this page
  • 📚 Introdução
  • 📥 Entradas
  • 📤 Saídas
  • 🧑‍🏫 Exercícios
  1. Python

Entradas e saídas

PreviousComplexidade de AlgoritmosNextConjuntos

Last updated 10 months ago

📚 Introdução

Nesse artigo, vamos aprender como fazer as entradas e saídas nos exercícios de programação competitiva, no geral usaremos os comandos padrões input() e print(), porém existem alguns casos que valem a pena serem explicados com mais detalhes, como os exercícios que utilizam EOF (End of File) e os que precisam de fast io.

📥 Entradas

Como mencionado, normalmente usaremos o método padrão de input do Python, com a função input().

Quando queremos ler mais de uma string na mesma linha, como por exemplo:

ufms feijoada

podemos usar o split():

a, b = input().split()

Agora se quisermos ler mais de um valor numérico, é melhor usar a função map(), que já converte os valores para o tipo desejado:

a, b = map(int, input().split())

Se precisarmos que os valores sejam armazenados em uma lista, podemos usar a coompreensão de listas.

a = [int(x) for x in input().split()]

Esse métodos é mais lento que o map(), então só o use quando você realmente precisa de uma lista, ou quando não se sabe o número de valores que serão lidos.

Antes de continuar, é importante conversar um pouco sobre os diferentes tipos de entradas que podemos encontrar, geralmente sabemos exatamente o número de linhas que serão lidas, por alguma estipulação do enunciado ou um valor do próprio input nos indica, como no exercício 1410 do Beecrowd:

A entrada pode parecer complicada, mas note que a primeira linha lida nos indica exatamente quantos valores vem a seguir, e o fim é indicado por dois valores 0 seguidos, então podemos ler a entrada da seguinte forma:

while True:
    atacantes, defensores = map(int, input().split())

    if atacantes == 0 or defensores == 0:
        break

Porém, existem casos onde não sabemos o número de linhas que serão lidas, como no exercício 2850 do Beecrowd:

O exercício nem nos disse isso, mas o final de um arquivo de entrada é sempre indicado por EOF (End of File), como não sabemos o número de linhas que serão lidas, nossa única opção é usar um loop infinito e tentar ler a entrada, e quando o EOF for encontrado, o Python lançará uma exceção EOFError, que podemos usar para sair do loop:

while True:
    try:
        lado = input()
        # restante do código
    except EOFError:
        break # entrada acabou, podemos sair do loop

Existe algo a mais que podemos fazer para deixar nossas entradas e saídas mais rápidas, isso é chamado de fast io, ou métodos rápidos de entrada e saída, o jeito mais rápido de ler valores em Python é usando o sys.stdin.readline():

import sys

a, b = map(int, sys.stdin.readline().split())
vet = [int(x) for x in sys.stdin.readline().split()]

Como pode ver, na maior parte dos casos só trocar o input() por sys.stdin.readline() é suficiente, porém temos que manter algumas coisas em mente ao usar o sys.stdin.readline():

  • Ele lê o no final da linha, isso normalmente não afeta em nada, pois o split() e int() já o removem, porém se quisermos ler uma única string a cada linha, temos que usar o .rstrip().

  • Essa função dá um erro diferente de EOFError ao ler um EOF, então temos que usar o try e except para lidar com isso.

📤 Saídas

O método padrão de output do Python é o print(), e é ele que usaremo na maior parte dos casos, porém, se precisarmos de fast io, temos que usar o sys.stdout.write():

import sys

sys.stdout.write(str(a) + '\n')

Note que usei ambas str() e + '\n', isso porque, assim como anteriormente, temos que manter algumas coisas em mente ao usar o sys.stdout.write():

  • Ele só aceita strings, então se quisermos escrever um inteiro, temos que usar o str() ou f-strings:

import sys

a = 42
sys.stdout.write(str(a) + '\n')
sys.stdout.write(f'{a}\n')
  • Ele não coloca o automaticamente no final da linha, isso é importante pois os juízes de código não aceitam a resposta se não tiver o no final da linha.

🧑‍🏫 Exercícios

Nenhum dos exercícios sugeridos abaixo necessariamente demanda o fast io, mas é uma boa hora pra você treinar isso e os diferentes tipos de entradas que vimos!

Exercício do Beeecrowd, que estava no aquecimento da OBI 2018, na fase nacional.

Exercício do Beecrowd, que caiu na OBI 2012.

Exercício do Beecrowd, que caiu na OBI 2012.

Exercício do Beecrowd, que caiu na OBI 2012.

Exercício do Beecrowd, que caiu na ACM/ICPC South America Contest 2007.

Exercício do Beecrowd, que caiu na V Maratona Norte Mineira de Programação, não se assuste com o nível 7 desse exercício, mantenha a calma e leia o que se pede.

2850
1248
2408
2420
1410
2770
Exercício 1410 do Beecrowd
Exercício 2850 do Beecrowd