Programação Competitiva

Algoritmo resolvidos e explicados da OBI e Maratona de Programação

  • Clipping de notícias
  • Dicas
    • Atribuição para várias variáveis com o mesmo valor
    • Entrada de vários conjuntos de teste até zeros [linguagem C]
    • Muitas saídas para serem mostradas
    • Saída com testes sequenciais [linguagem C]
    • Otimizações para o código
      • Melhorando o desempenho da entrada e saída [C++]
      • Utilize operadores bitwise
      • Shortcodes
  • Solução Computacional x Matemática
    • Importância de pensar os elementos de uma estrutura for
  • Sobre competições de programação
    • Sobre a maratona de programação
    • Sobre a OBI
    • Links para materiais da maratona
    • Links para materiais da OBI
      • Material introdutório para crianças
        • 1. Bem vindo ao maravilhoso mundo da programação
        • Aprendendo lógica com o Angry Birds
        • Blockly

Entrada de vários conjuntos de teste até zeros [linguagem C]

Uma forma bastante popular de entrada de dados é a leitura indefinida de valores, tendo como critério de parada dessas entradas a ocorrência de valores zero. Esse tipo de entrada pode ser encontrado na questão Temperatura Lunar [OBI 2002].

A entrada pode ser simplificada como:

  • A entrada é composta de vários conjuntos de teste.
  • A primeira linha de um conjunto de teste contém dois números inteiros positivos N (0 ≤ N ≤ 10000) e M (1 ≤ M ≤ N), que indicam respectivamente […].
  • As N linhas seguintes contêm […].
  • O final da entrada é indicado quando N = M = 0.

O código para essa entrada pode ser facilmente escrito como a seguir.

int main() {
  int n, m;

  scanf("%d %d", &n, &m);
  
  while (n > 0) {
      //Faz o que é necessário

      scanf("%d %d", &n, &m);
  } 

  return 0;
}

Embora a condição seja interromper a leitura de entradas quando forem fornecidos os valores zero, veja que na condição do while eu utilizei n > 0 e não n != 0. Isso porque o enunciado indicou que somente valores positivos serão informados e escrever o símbolo de maior exige apenas um caractere, enquanto o símbolo de diferente requer dois caracteres (sem contar que a pressa pode fazer você escrever =! e perder mais um tempo para encontrar esse erro).

Veja também que, embora o enunciado diga que a condição de parada seja serem fornecidos dois valores zero, eu não utilizei n > 0 && m > 0. Como foi dito no enunciado que M será maior ou igual a 1 (1 ≤ M), então quando m for zero é porque é para parar (e tanto fazia testar o zero na variável n ou m).

Com isso, o código pode ser simplificado para:

int main() {
  int n, m;
  
  while (scanf("%d %d", &n, &m) == 2 && n > 0) {
      // Faz o que é necessário

  }
  
  return 0;
}

Basicamente eu removi as linhas 4 e 9 e fiz o scanf dentro do while a partir da instrução scanf(“%d %d”, &n, &m) == 2. O valor de retorno da função scanf é o número de elementos lidos com sucesso e por isso o teste de igualdade feito. também utilizei o operador lógico de conjunção (&&) para manter a condição que já tinha anteriormente.

Foi uma pequena dica, mas ela também ajuda a ter um maior domínio da função scanf.

  • Sobre o blog

    Nesse blog estão reunidas explicações preparatórias para a Olimpíada Brasileira de Informática (OBI) e a Maratona de Programação.

    São trazidos problemas e resoluções comentadas.
  • Categorias

    • Competição (34)
      • Maratona de Programação (13)
      • OBI (21)
    • Linguagem (33)
      • C/C++ (32)
      • Python (8)
Proudly powered by WordPress Theme: Parament by Automattic.