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.
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
.
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 \n
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";
}
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 2850 do Beeecrowd, que estava no aquecimento da OBI 2018, na fase nacional.
-
Exercício 1248 do Beecrowd, que caiu na OBI 2012.
-
Exercício 2408 do Beecrowd, que caiu na OBI 2012.
-
Exercício 2420 do Beecrowd, que caiu na OBI 2012.
-
Exercício 1410 do Beecrowd, que caiu na ACM/ICPC South America Contest 2007.
-
Exercício 2770 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.