sábado, 29 de setembro de 2012

Guia: Tipos de Entrada do SPOJ

Bom, quem já utiliza o SPOJ a algum tempo deve ter notado que existem certos "padrões" em que seu código deve se encaixar, porém estes não são sempre os mesmos. Foi preciso algum tempo até me acostumar com todos, porém hoje vou repassar alguns aqui para quem não está acostumado.

Tipos de Entrada:
Vou citar alguns tipos de entrada comuns no SPOJ.

- "O final da entrada é indicado por uma linha que contém apenas dois zeros, separados por um espaço em branco", como citado no exercício SUBPRIME.
Este tipo de entrada significa que o seu programa deve continuar rodando, mesmo após ter mostrado os resultados do primeiro teste, parando apenas quando as entradas forem iguais a 0.
Para casos como este, basta um loop infinito que abranja todo o código, com excessão das inicializações das variáveis (conselho pessoal), e com a leitura de entrada logo como primeira instrução do loop. Após a leitura, uma condição para que se caso os valores sejam iguais a zero poderia levar a quebra desse loop, que levaria ao fim do programa.

- "A entrada contém um único conjunto de teste ...", como citado no exercício CHOCPJ09.
Entre os mais comuns tipos de entrada, a entrada contém apenas um único conjunto de testes. Portanto, não é necessário nenhum loop de repetição.
Como um algoritmo comum, basta que rode apenas uma vez e termine.

- "A entrada é composta por diversos casos de teste.", como citado no exercício FOCO, ou "O final da entrada deve ser o final do arquivo.", como retirado da minha memória.
Esta é uma das entradas que mais confundem os programadores inexperientes.
O segundo exemplo que citei é mais claro, porém o primeiro deixou a desejar.
Trata-se do seguinte: Seu programa deverá receber as entradas, até que se encontre o "final do arquivo", que seria algo como o fim do arquivo do qual está sendo retirado os testes.
A única forma que encontrei de lidar com este tipo de entrada, em c ou c++, foi utilizar o scanf dentro da condição do loop while, tal como while(scanf("%d",&num)!=EOF).
Pra quem não entendeu, EOF significa End of File( ou fim do arquivo), portanto o algoritmo irá entrar no loop caso a entrada seja diferente do fim do arquivo.

Bom, esses são os mais comuns e os que eu me lembro por hora. Caso ainda tenha ficado alguma dúvida, ou caso encontrem algum tipo de entreda que não entendam, postem nos comentários.
Em breve farei um post sobre os não menos importantes tipos de saída do SPOJ.

Até mais.

4 comentários:

  1. Me ajuda com problema FOCO!

    ResponderExcluir
  2. Qual exatamente é seu problema com esse exercício?

    ResponderExcluir
    Respostas
    1. Preciso de saber a sequência de passos para resolvê-lo, usei várias abordagens mas não consegui sucesso, apenas para algumas instâncias de dados.

      Excluir
    2. Eu não cheguei a resolver esse exercício, mas pelo que sei, você basicamente precisa ordenar as entradas, e então verificar um valor de foco da primeira foto que possa excluir as próximas. Esse processo deve ser repetido até que não haja mais fotos.

      Excluir