DPUM'2004
Aspectos práticos da resolução dos problemas do concurso
Este documento contém informação prática relevante para a resolução dos problemas apresentados no Concurso de Programação da Nova.
Restrições durante a compilação dos programas
Estas são estas as restrições impostas pelo sistema de avaliação, durante a compilação de programas:
- Tempo máximo de compilação: 60 segundos.
- Tamanho máximo dum programa: 100 Kbytes.
- Cada programa tem de ficar integralmente incluido num único ficheiro.
- No caso da linguagem Java, o ficheiro ".java" tem de ter o mesmo nome que a classe do método "main".
Opções de compilação
É indispensável conhecer as opções de compilação que o sistema de avaliação automático usa. Por exemplo, sabia que a compilação é efectuada com todos os warnings ligados, em C, C++ e Pascal?
Para evitar dissabores, ao testar cada solução, é importante usar as mesmas opções de compilação do avaliador automático!
Eis as opções de compilação que o sistema de avaliação usa, para as diversas linguagens:
- gcc -Wall -lm
- g++ -Wall
- fpc -v0w
- javac
Versões dos compiladores
O sistema de avaliação corre em Linux e usa versões relativamente recentes dos compiladores:
- gcc/g++ 3.2.2
- fpc 1.0.10
- java 1.4.2_2
Restrições durante a a execução dos programas
Estas são estas as restrições impostas pelo ambiente de execução dos programas:
- Tempo máximo de CPU: 5 segundos
- Memória disponível para variáveis globais e dinâmicas: 2 megabytes
- Memória disponível para pilha de execução e variáveis locais: 1 megabyte
Os recursos disponíveis são largamente suficientes para resolver qualquer problema do concurso, independentemente da linguagem usada.
Dados de entrada
Os dados de entrada, usados para testar as soluções dos concorrentes, são lidos da entrada padrão. Consistem em texto cuidadosamente formatado para ser simples de processar:
- Normalmente, nas primeiras linhas dos dados de entrada surgem alguns números inteiros que anunciam o tamanho das diversas partes do texto que se segue. Isso evita a necessidade de testar a condição de "fim-de-ficheiro", durante a leitura dos dados.
- A última linha do ficheiro está sempre devidamente terminada por uma mudança de linha.
- Espaços em branco, quando usados, são sempre considerados como separadores. Os espaços em branco nunca ocorrem em grupos. Uma linha nunca começa com um espaço em branco. Uma linha nunca acaba com um espaço em branco.
Note que as linhas com números inteiros que ocorrem no início dos dados de entrada devem ser consumidas bem até ao fim para evitar desalinhamentos na leitura dos dados subsequentes. Eis como isso se faz nas várias linguagens:
- Supondo que os dados se iniciam por uma linha contendo um inteiro isolado:
C
int n ;
scanf("%d", &n) ;
getchar() ; /* Salta a mudança de linha. */
C++
int n ;
std::cin >> n ;
getchar() ; /* Salta a mudança de linha. */
Java
/* Aviso: nunca crie mais do que um BufferedReader sobre o input. */
int n ;
String s = null ;
BufferedReader r =
new BufferedReader(new InputStreamReader(System.in)) ;
try { s = r.readLine() ; } catch(IOException e) {}
n = Integer.parseInt(s.trim()) ;
Pascal
n : Integer ;
readln(n) ;
Supondo que os dados se inicia por uma linha contendo dois inteiros separados por um espaço em branco:
C
int n, m ;
scanf("%d %d", &n, &m) ;
getchar() ; /* Salta a mudança de linha. */
C++
int n, m ;
std::cin >> n >> m ;
getchar() ; /* Salta a mudança de linha. */
Java
/* Aviso: nunca crie mais do que um BufferedReader sobre o input. */
int n, m ;
String s = null ;
BufferedReader r =
new BufferedReader(new InputStreamReader(System.in)) ;
try { s = r.readLine() ; } catch(IOException e) {}
StringTokenizer st = new StringTokenizer(s) ;
n = Integer.parseInt(st.nextToken().trim()) ;
m = Integer.parseInt(st.nextToken().trim()) ;
Pascal
n, m : Integer ;
readln(n, m) ;
Dados de saída
Os dados de saída, produzidos pelos programas dos concorrentes, são escritos na saída padrão. É necessário respeitar rigorosamente o formato exigido no enunciado. Qualquer desacerto, mesmo ligeiro, é suficiente para que um programa seja classificado como "Presentation error".
Note que não é possível detectar visualmente certas anomalias nos dados de saída. Por exemplo: um espaço em branco no final duma linha, uma linha em branco no final dos dados, a omissão da mudança de linha na última linha dos dados. Todas estas situações são inaceitáveis e provocam um "Presentation error".