💡
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. C++

Entradas e saídas

📚 Introdução

Nesse artigo, vamos aprender como fazer as entradas e saídas nos exercícios de programação competitiva, em C++, temos dois pares de opções, se você é familiar com C, você pode usar scanf e printf, mas o mais comum é usar cin e cout, que são mais fáceis de usar e mais seguros, 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 sobre fast io.

📥 Entradas

Como mencionado, normalmente usaremos o método padrão de input do C++, da biblioteca iostream, com a função cin.

Quando queremos ler mais de um valor na mesma linha, como por exemplo:

ufms feijoada

podemos fazer isso com o cin:

#include <iostream>

using namespace std;

int main() {
    string a, b;
    cin >> a >> b;
}

Se precisarmos que os valores sejam armazenados em um vetor, podemos fazer isso com um loop:

#include <iostream>
#include <bits/stdc++.h>

using namespace std

int main() {
    int n;
    cin >> n;

    vector<int> vet(n);
    for (int i = 0; i < n; i++) {
        cin >> vet[i];
    }
}

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:

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

int main() {
    int atacantes, defensores;
    while (true) {
        cin >> atacantes >> defensores;

        if (atacantes == 0 || 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, temos que usar um while loop que lê até o EOF:

#include <iostream>

using namespace std;

int main() {
    string lado;
    while (cin >> lado) {
        // restante do código
    }

    return 0;
}

Existe algo a mais que podemos fazer para deixar nossas entradas e saídas mais rápidas, isso é chamado de fast io, em C++ isso é feito colocando ios::sync_with_stdio(false); cin.tie(0); dentro da sua main, isso faz com que o cin e cout, sejam mais rápidos, porém atenção, se fizermos isso não podemos mais usar scanf e printf, pois eles não são mais sincronizados com o cin e cout.

📤 Saídas

O método padrão de output do C++ é o cout, e ele é bem simples de usar, como vimos anteriormente, podemos imprimir valores com ele:

#include <iostream>

using namespace std;

int main() {
    int a = 10;
    cout << a << endl;
}

É mais recomendado usar ao invés de endl, pois o endl faz um flush no buffer, o que pode ser mais lento, e em exercícios de programação competitiva, a velocidade é importante, vamos ver um exemplo de como imprimir um vetor:

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

int main() {
    vector<int> vet = {1, 2, 3, 4, 5};
    for (auto i: vet) {
        cout << i << " ";
    }
    cout << "\n";
}

🧑‍🏫 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!

PreviousComplexidade de AlgoritmosNextConjuntos

Last updated 10 months ago

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