terça-feira, 17 de fevereiro de 2009

1.6.4 Display LCD

PC/UVa IDs: 110104/706, Popularidade: A, Taxa de Sucesso: Média Nível: 1

Um amigo seu acaba de comprar um novo computador. Antes deste, a mais poderosa máquina que dele era uma calculadorade de bolso. Ele está um pouco decepcionado, porque ele gostava do visor LCD da sua calculadora mais do que a tela em seu novo computador! Para fazê-lo feliz, escrever um programa que imprime números no estilo LCD.

Entrada

O arquivo de entrada contém várias linhas, uma para cada número a ser exibido. Cada linha contém inteiros s e n, onde n é o número a ser exibido (0 ≤ n ≤ 99, 999, 999) e s é o tamanho no qual deve ser exibido (1 ≤ s ≤ 10). A entrada será encerrado por uma linha contendo dois zeros, que não deve ser processado.

Saída

Imprime os números especificados no arquivo de entrada em um visor de estilo LCD, usando s "-" sinais para os segmentos horizontais e s "|" os sinais para a vertical. Cada dígito ocupa exatamente s + 2 colunas e 2s + 3 linhas. Certifique-se de preencher todos os espaços ocupados pelos dígitos brancos com espaços em branco, incluindo o último dígito. Deve haver exatamente uma coluna de espaços em branco entre dois dígitos.

Saída de uma linha em branco depois de cada número. Você encontrará um exemplo de cada dígito na amostra de saída abaixo.

Exemplo de Entrada à esquerda
Exemplo de Saída à direita

domingo, 15 de fevereiro de 2009

1.6.3 A Viagem

PC/UVa IDs: 110103/10137, Popularidade: B, Taxa de Sucesso: Médio Level: 1

Um grupo de estudantes é membro de um clube que viaja anualmente para locais diferentes. Seus destinos no passado ter incluído Indianapolis, Phoenix, Nashville, Philadelphia, San Jose, e Atlanta. Esta Primavera eles estão a planear uma viagem a Eindhoven.

O grupo concorda com antecedência para partilhar as despesas da mesma forma, mas não é prático para compartilhar todos os gastos, uma vez que ocorre. Assim, indivíduos do grupo especial para pagar as coisas, tais como refeições, hotéis, passeios de táxis, e os bilhetes de avião. Após a visita, cada despesa dos alunos são registradas e dinheiro é trocado por forma a que o custo líquido para cada um deles seja o mesmo, para dentro de um cêntimo. No passado, esse dinheiro foi troco tedioso e demorado. Seu trabalho é o de calcular, a partir de uma lista de despesas, o montante mínimo de dinheiro que deve mudar de mãos, a fim de equalizar (dentro de um centavo) todos os alunos dos custos.

Entrada

Padrão de entrada irá conter as informações de várias viagens. Cada visita consiste em uma linha contendo um inteiro positivo n denota o número de alunos sobre a viagem. Isto é seguido por n linhas de entrada, cada uma contendo o montante gasto por um estudante em dólares e centavos. Não existem mais de 1000 estudantes e nenhum estudante gastou mais de US $ 10.000,00. Uma única linha contendo 0 segue as informações para a última viagem.

Saída

Para cada viagem, a produção de uma linha indicando o montante total de dinheiro, em dólares e centavos, que devem ser trocadas para equalizar os alunos "custos.

Exemplo de Entrada

3
10.00
20.00
30.00
4
15.00
15.01
3.00
3.01
0


Exemplo de Saída

$10.00
$11.99

sábado, 14 de fevereiro de 2009

1.6.2 Minesweeper

PC/UVa IDs: 110102/10189, Popularidade: A, Taxa de Sucesso: Alta Nível: 1

Alguma vez você já jogou Minesweeper? Este lindo joguinho vem com um certo sistema operacional cujo nome não se pode lembrar. O objetivo do jogo é encontrar todas as minas que estão localizadas dentro de um campo M × N.

O jogo apresenta um número em um quadrado que diz-lhe quantas minas existem adjacentes ao que quadrado. Cada quadrado tem, no máximo, oito praças adjacentes. O campo 4 × 4 da esquerda contém duas minas, cada um representado por um asterisco "*". Se o mesmo campo que nós representamos pela dica números descritos acima, acabamos com o campo da direita:

*...
....
.*..
....

*100
2210
1*10
1110

Entrada

A entrada será constituída por um número arbitrário de campos. A primeira linha de cada campo contém dois inteiros n e m (0 < n, m ≤ 100) que defendem que o número de linhas e colunas do campo, respectivamente. Cada uma das próximas n linhas contém exatamente m caracteres, que representa o campo. Safe praças são indicadas por "." Mina e praças por "*", ambos sem as aspas. O primeiro campo linha onde n = m = 0 representa o fim da contribuição e não deve ser processado.

Saída

Para cada campo, imprimir a mensagem Campo #x: sozinho em uma linha, onde x representa o número do campo a partir de 1. As próximas n linhas devem conter o campo com o caractere "." substituído pelo número de minas adjacentes a esse quadrado. Deve haver uma linha vazia entre campo saídas.

Exemplo de Entrada

4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0


Exemplo de Saída

Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100

1.6 O Problema 3n+1

PC/UVa IDs: 110101/100, Popularidade: A, Taxa de Sucesso: Baixa Nível: 1

Considere o seguinte algoritmo para gerar uma seqüência de números. Comece com um inteiro n. Se n for par, dividir por 2. Se n for ímpar, multiplique por 3 e adicione 1. Repita esse processo com o novo valor de n, encerra quando n = 1. Por exemplo, a seguinte seqüência de números serão gerados para n = 22:

22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

É 'conjectured' (mas ainda não comprovada) de que este algoritmo irá encerrar no n = 1 para cada inteiro n. Ainda assim, vale para todas as 'conjecturas' inteiros até, pelo menos, 1.000.000.

Para uma entrada n, o ciclo de comprimento de n é o número de números gerados até e incluindo o 1. No exemplo acima, a duração do ciclo de 22 a 16. Dado dois números quaisquer i e j, que está a determinar o valor máximo da duração do ciclo de todos os números entre i e j, incluindo os dois pontos finais.


Entrada

A entrada será constituído por uma série de pares de inteiros i e j, um par de inteiros por linha. Todos os inteiros serão inferiores a 1000000 e superiores a 0.


Saída

Para cada par de entradas inteiros i e j, saída i, j na mesma ordem em que apareceu na entrada e, em seguida, o limite máximo para a duração do ciclo entre inteiros e incluindo i e j. Estes três números devem ser separados por um espaço, com todos os três números de uma linha e com uma linha de produção para cada linha de entrada.


Exemplo de Entrada

1 10
100 200
201 210
900 1000

Exemplo de Saída

1 10 20
100 200 125
201 210 89
900 1000 174

1.6 Problemas

1.5 Sobre os Problemas

Cada capítulo deste livro termina com um conjunto adequado de problemas de desafios de programação. Estes desafios foram cuidadosamente seleccionados dentre mais de 1000 tais problemas cobrados ao site de Universidad de Valladolid. Estamos destinados a clara, problemas inteligentes com diferentes graus de dificuldade. Estamos especialmente olhou para essa centelha de insight que transforma um problema em um desafio.

A descrição de cada problema selecionado foi editado pela exatidão e legibilidade. Temos tentado preservar a cor local e sabor original de cada problema, enquanto que a linguagem razoavelmente consistente. O número de identificação para cada problema, em ambos os sites julgadores é prestado. Esses números são importantes para uma boa apresentação. O primeiro número para cada par está associado http://www.programming-challenges.com; o segundo número obras sobre http://online-judge.uva.es.

Para dar uma ideia quanto à relativa dificuldade dos problemas, cada um tem sido anotados em três formas diferentes. Primeiro, cada problema tem sido atribuído um grau de A, B ou C, refletindo quantas soluções o juiz corrigir tem visto ao longo dos anos. Problemas A são presumivelmente mais fácil de resolver ou de alguma maneira mais atraentes do problemas B. Em segundo lugar, a freqüência que apresentou soluções para cada problema são aceitos pelo juiz é classificada como alta, média ou baixa. Mínimo pode indicar percentagens particularmente sensível juízes, ou talvez os problemas que exigem mais do que o inicialmente aparente sutileza. Ou eles podem refletir apenas bugs no teste casos que já foram corrigidos. Por isso, não obsedar demasiado sobre estas classificações. Finalmente, fazemos uma avaliação subjetiva (de 1 a 4) do nível acadêmico necessário para resolver o problema. Os números mais elevados indicam problemas mais sofisticados.

Boa sorte, e happy hacking!

1.4 Tipos de Dados Elementares

Estruturas de dados simples, tais como matrizes têm uma importante vantagem sobre estruturas de dados mais sofisticadas, tais como listas ligadas: são simples. Muitos tipos de erros nas estruturas de base ponteiro simplesmente não pode acontecer com matrizes estáticas.

O sinal de uma maturidade profissional é manter os empregos simples. Isto é especialmente desafiador para aqueles que estão apenas aprendendo um novo assunto. Estudantes de Medicina fornecem um exemplo clássico deste problema. Após a sessão através de algumas palestras sobre doenças tropicais obscuro, um jovem médico teme que qualquer paciente com um sniffle e uma erupção cutânea pode ter o vírus Ébola ou peste bubónica, embora um pouco mais experiente médico envia-los em casa com uma garrafa de aspirina.

Igualmente, você pode ter aprendido recentemente equilibrada sobre pesquisa árvores binária, com exceção de manuseamento, processamento paralelo, e diversos modelos de objeto herança. Estes são todos úteis e importantes temas. Mas eles não são necessariamente a melhor maneira de obter um programa correto de trabalho para uma tarefa simples.

Então, sim, estruturas de ponteiro são bases muito poderosas se você não sabe o tamanho máximo do problema com antecedência, ou no apoio à pesquisa e atualização operações rápida. No entanto, muitos dos problemas que resolveremos aqui têm tamanhos máximos especificados. Além disso, o robô permite julgar normalmente alguns segundos para o seu trabalho para concluir, que é um monte de computação tempo quando você parar para pensar nisso. Você não obtem pontos extras para acabamento mais rápido.

Então, qual é a simples, maduro abordagem de estruturas de dados? Em primeiro lugar, estar familiarizado com os tipos de dados básicos primitivos construídos em sua linguagem de programação. Em princípio, você pode construir praticamente qualquer coisa que você quiser a partir de apenas estes:

• Arrays - workhorse Este tipo de dados permite o acesso aos dados por posição ou índices, e não conteúdo, tal como os números de casa numa rua permitir o acesso por endereço, nem nome. Eles são usados para armazenar seqüências de um único tipo de elementos, tais como números inteiros, reais, compostos ou objetos, tais como registros. Arrays de caracteres pode ser usado para representar uma string (texto), enquanto arranjos de string podem ser usados para representar apenas sobre qualquer coisa.

Sentinelas pode ser uma técnica útil para simplificar a matriz à base de programação. Um sentinela é um elemento guarda, implicitamente verificar que o programa não é executado para além dos limites do array sem realizar um teste explícito. Considere o caso de inserir elemento x em uma boa posição entre os n elementos de um array ordenadas a. Podemos testar explicitamente cada passo, para ver se temos atingido o fundo do array como à esquerda:



ou, podemos ter certeza de que um falso elemento a[0] é menor do que qualquer coisa que se defrontarão como à direita. Utilização adequada de sentinelas, e tendo a certeza que sua matriz é um pouco maior do que o que provavelmente deve ser, pode ajudar a evitar muitos erros fronteira.

• Arrays Multidimensionais - Grade de estruturas retangulares, tais como imagens e chessboards primeiro vem à mente quando se pensa matrizes bidimensionais, mas de um modo mais geral, podem ser usados para agrupar registro de dados homogéneos. Por exemplo, um conjunto de n pontos no x - y avião pode ser pensado como uma matriz n × 2, quando o segundo argumento (0 ou 1) de A[i] [j] ditames se estamos nos referindo ao x ou y coordenadas do ponto.

• Registros (Records/Structs) - Estes são utilizados para agrupar os registos de dados heterogêneos. Por exemplo, um conjunto de pessoas, registros podem fixos em conjunto do povo nomes, números de ID, alturas e pesos em um simples pacote. Os registos são importantes para a clareza conceitual em grandes programas, mas muitas vezes esses campos podem ser representados válvula usando arrays separados em programas de dimensão modesta.

Se é melhor usar registros ou arrays multidimensionais em um problema nem sempre é uma clara decisão. Pense no problema de representar os pontos em x - y plano discutido acima. A representação óbvia seria um registro ou a estrutura, tais como:

struct point {
int x, y;
};

em vez de um array de dois elemento. Uma grande vantagem para registros é que a notação p.x e p.y estão mais próximas da nossa notação natural para trabalhar com os pontos. No entanto, uma desvantagem da representação em registro é que você não pode ciclo longo variáveis individuais, como você pode elementos em um array.

Suponha que você quis mudar um programa para trabalhar com geométrica tridimensional pontos em vez de dois, ou mesmo em dimensões arbitrárias. Claro que você pode facilmente adicionar novos campos para o registro, mas todos os locais onde você fez cálculos sobre x e y agora você deve replicar-los para z. Mas, usando a matriz representação, alterando computações distância de dois a três dimensões pode ser tão simples como mudar uma constante:

typedef int point[DIMENSION];
double distance(point a, point b)
{
int i;
double d=0.0;
for (i=0; i < DIMENSION; i++)
d = d + (a[i]-b[i]) * (a[i]-b[i]);
return( sqrt(d) );
}


No capítulo 2 iremos analisar estruturas de dados mais avançadas que podem ser construídas a partir destas tipos básicos primitivas. Estes vão deixar-nos trabalhar com níveis mais altos de abstração, mas não ter medo de usar tecnologia simples quando basta para o trabalho.

1.3 Dicas de Programação

Não é nosso propósito neste livro para ensinar-lhe como programar, apenas a forma de programar melhor. Assumimos que você esteja familiarizado com os conceitos fundamentais, tais como variáveis, declarações condicional (por exemplo, if-then-else, case), iteração primitivas (por exemplo, for-do,
while-do, repeat-until), subrotinas e funções. Se você não estiver familiarizado com estes conceitos você pode ter pego o livro errado, mas comprar de qualquer jeito para uso posterior.

É importante perceber quanta energia existe no que você já conhece. Em princípio, todos os interessantes algoritmo / programa podem ser construídos a partir daquilo que se aprende em um primeiro curso de programação. Os recursos poderosos de linguagens de programação modernas não são realmente necessários para construir coisas interessantes - apenas para fazê-las em mais limpo, melhores maneiras.

Dito de outra forma, torna-se um bom escritor não aprendendo vocabulário palavras adicionais, mas por encontrar algo para dizer. Após um ou dois cursos de programação, você sabe todas as palavras que você precisa compreender. Os problemas neste livro esforçamos para dar-lhe algo de interessante a dizer.

Nós oferecemos um pequeno número de dicas de codificação de baixo nível, que são úteis na construção de programas de qualidade. Os maus exemplos vêm de todas as submissões para o robô real juiz.

• Escreva os primeiros Comentários - Iniciar os programas e procedimentos por escrito algumas frases explicando aquilo que é suposto fazer. Isto é importante porque, se você não consegue escrever esses comentários, você provavelmente não entende muito bem o que o programa faz. Às vezes é muito mais fácil para depurar nossos comentários do que os nossos programas, e acreditamos que o tempo adicional digitado é muito bem gasto. Claro que com o tempo de pressão de um concurso vem uma tendência a entrar em desleixo, mas faça-o em seu próprio risco.

• Documentar cada variável - Escrever um comentário de uma linha de cada variável quando você declará-lo assim que você sabe o que faz. Novamente, se você não consegue descrevê-lo facilmente, você não sabe por que ela está lá. Você provavelmente vai estar a viver com o programa por pelo menos um depurar alguns ciclos, e este é um investimento modesto de legibilidade, no qual você venha a apreciar.

• Utilize Simbolos Constantes - Sempre que você tem uma constante em seu programa (tamanho de entrada, constante matemática, tamanho de estrutura dos dados, etc) declarar o que será, no topo do seu programa. Horrivelmente insidiosos erros podem resultar do uso inconsistente de constantes em um programa. Obviamente, o nome simbólico contribui apenas se você realmente utilizá-lo em seu programa sempre que você precisar da constante. . .

• Utilize Tipos enumerados por uma razão - enumerou tipos (ou seja, tais variáveis simbólicas Booleans (true, false)) podem ser ótimos auxiliares para a compreensão. No entanto, são muitas vezes desnecessários em programas curtos. Nota: este exemplo que representa o naipe (paus, diamante, coração, espada) de um baralho de cartas:

switch(cursuit) {
case ’P’:
newcard.suit = P;
break;
case ’D’:
newcard.suit = D;
break;
case ’C’:
newcard.suit = C;
break;
case ’E’:
newcard.suit = E;
...

Não há novas clareza resulta da utilização da enumerou variáveis (P, D, C, E) sobre o carácter original representação ( 'P', 'D', 'C', 'E'), só novas oportunidades de erro.

• Utilize subrotinas Para Evitar Códigos Redundantes - Leia o seguinte fragmento de fragmento a gerir o estado de uma placa retangular, e pense como você pode encurtar e simplificá-lo:

...
while (c != ’0’) {
scanf("%c", &c);
if (c == ’A’) {
if (row-1 >= 0) {
temp = b[row-1][col];
b[row-1][col] = ’ ’;
b[row][col] = temp;
row = row-1;
}
}
else if (c == ’B’) {
if (row+1 <= BOARDSIZE-1) {
temp = b[row+1][col]; b[row+1][col] = ’ ’;
b[row][col] = temp; row = row+1;
}
}
...

Em todo o programa, houve quatro blocos de três linhas de cada um valor que se deslocam para uma célula vizinha. Mistyping um único + ou - teria consequências letais. Seria muito mais seguro para escrever um simples mover-swap rotina e chamá-lo com o bom argumentos.

• Faça Sua Debugging Declarações Significativas - Aprenda a utilizar a depuração ambiente no seu sistema. Isso permite-lhe para a execução de uma determinada condição ou declaração, assim você pode ver que os valores de todas as variáveis são associadas. Esta é geralmente mais rápido e mais fácil do que digitar em um monte de declarações de saída.

Mas se você estiver indo para inserir depuração imprimir declarações, torná-los dizer algo. Imprimir todas as variáveis relevantes, bem como o rótulo impresso quantidade variável com o nome. Senão fica fácil se perder na sua própria depuração saída.

A maioria dos estudantes de informática são agora bem versáteis em programação orientada a objetos, uma engenharia de software filosofia do software projetado para a construção de componentes reutilizáveis e explorá-los. Programação orientada a objetos é útil para construir grandes, programas reutilizáveis. No entanto, a maioria dos problemas de desafios de programação neste livro foram concebidas para serem resolvidos a curto, inteligente programas. O pressuposto básico de programação orientada a objetos, apenas não é aplicável neste domínio, para definir novos objetos complexos (por oposição à utilização de objectos predefinidos), é provável que seja um desperdício de tempo.

O truque para uma boa programação não é o abandono estilo, mas usando uma adequada à dimensão da tarefa.


sexta-feira, 13 de fevereiro de 2009

1.2.3 Entrada e Saída Padrão

Programadores UNIX estão familiarizados com noções de filtros e os tubos-programas, que têm um fluxo de entrada e produzir um fluxo de saída. A produção de tais programas é adequada para a alimentação de outros programas como entrada. O paradigma é um dos poucos programas de stringing lotes juntos em vez de produzir grandes e complicados sistemas de software que tentam fazer tudo.

Esta filosofia de software tem tido um pouco de uma surra nos últimos anos, devido à popularidade de interfaces gráficas do utilizador. Muitos programadores instintivamente colocou uma interface ponto-e-clique de cada programa. Mas essas interfaces podem tornar muito difícil a transferência de dados a partir de um programa para outro. É fácil manipular a saída texto em outro programa, mas o que pode fazer com uma imagem diferente do olhar para ela?



Figura 1.2. Exemplos de Entrada e Saída Padrão em C (à esquerda), C++ (centro), e Pascal (direita).

As normas de E/S do juiz refletem as regras da ACM. Cada programa deve ler os dados de ensaio do padrão de entrada e imprimir os resultados para a saída padrão. Os programas não estão autorizados a abrir arquivos ou a executar determinadas chamadas de sistema.

Padrão de entrada / saída é bastante simples em C, C + + e Pascal. A Figura 1.2 fornece um exemplo simples em cada linguagem que se lê em dois números por linha e relatórios o valor absoluto da sua diferença. Observe como a sua linguagem favorita testes para o fim-de-arquivo encerra condição. A maioria dos problemas tornar ainda mais fácil de entrada de transformação, indicando uma contagem do número de exemplos ou descrever uma linha especial terminação.

A maioria das linguagens fornecem poderosas funções como forma E / S. Quando usado corretamente, única linha de comandos podem tornar desnecessários determinados doloroso parsing e formatação rotinas escritas por aqueles que não leram o manual.

No entanto, entrada / saída padrão em Java não é fácil . Um modelo eletrônico de E / S para Java (35 linhas) está disponível a partir http://www.programming-challenges.com. Configurá-lo uma vez e utilizá-lo para todas as suas entradas.

Programas Java apresentados ao juiz deve ser constituído por um único arquivo código-fonte . Eles são actualmente compilados e executados como aplicações nativas usando o gcj compilador, mas isto pode mudar no futuro. Note-se que o uso de java::io é restrito, o que implica que algumas funcionalidades não estão disponíveis. Funções e os fios de rede também são indisponíveis. No entanto, os métodos úteis de matemática e outros pacotes comuns estão autorizadas. Todos os programas devem começar em um método principal estático em uma classe principal. Não utilize classes públicas: mesmo principal deve ser não-públicas para evitar a compilar erros. No entanto, você pode adicionar e exemplo, como muitas classes, conforme necessário.

Se você está usando um sistema operacional / compilador, o que torna difícil a utilização padrão de entrada / saída, nota que o juiz sempre define o ONLINE JUDGE símbolo ao compilar o seu programa. Assim, você pode testá-lo e para redirecionar a entrada / saída para um arquivo quando executado no seu próprio sistema.

1.2.2 Lendo Nossos Programas

Vários exemplos de programação aparecem neste livro, que ilustram técnicas de programação e prestação completa implementações de algoritmos fundamentais. Todo este código estão disponível em http://www.programming-challenges.com para usar e experimentar. Não há melhor forma de depurar programas que eles tenham lido por vários milhares de estudantes brilhantes, para olhar lá para errata e revistas soluções.

Nossos exemplos de programação são executadas em um subconjunto de baunilha C, o que esperamos que venha a ser compreensível por todos os nossos leitores com relativamente pouco esforço. C em si é um subconjunto de C++ e sua sintaxe é muito semelhante ao Java. Nós temos tido o cuidado de evitar o uso estranho C-específicas construções, estruturas e dinâmicas ponteiro memória atribuição ao longo deste livro, de modo que permanecem deve ser familiar para os usuários de todos os quatro do juiz de linguagens de programação.

Nós fornecemos algumas dicas sobre C abaixo do qual possa ser útil na leitura nossos programas:

• Passagem de Parâmetros - Todos os parâmetros em C são transmitidas por chamada por valor, o que significa que cópias de todos os argumentos são feitos em funções chamadas. Isto parece sugerir que é impossível escrever funções que têm efeitos secundários. Em vez disso, C encoraja-lo a passar um ponteiro para qualquer argumento que você pretende modificar dentro do corpo da função. Nossa única utilização dos ponteiros serão no parâmetro passagem. O ponteiro para x é denotado por &x, enquanto que o item apontado por p é denotado *p. Não fique confuso entre multiplicação e ponteiro dereferencing!

• Tipos de Dados - C suporta vários tipos de dados básicos, incluindo int, float, char e, que todos devem ser auto-explicativo. Maior precisão e Ints floats são denotadas long e double, respectivamente. Todas as funções retornam um valor do tipo int, se não especificado de outra forma.

• Arrays - índices de array em C sempre variam de 0 a n-1, onde n é o número de elementos do array. Assim, se queremos começar com um primeiro índice de 1 por conveniência, tivemos mais lembre-se de alocar espaço para n + 1 elementos do array. No tempo de execução não é feita a verificação sobre a validade dos limites das matrizes, por isso esses erros são uma causa comum em falha de programa. Nós nem sempre somos coerentes, para onde o primeiro elemento de cada matriz está localizada. A partir de C 0 é o tradicional estilo. No entanto, por vezes é mais clara ou mais fácil começar em 1, e estamos dispostos a pagar um extra de memória local para o privilégio. Tente não ser confundido ao ler o nosso código.

• Operadores - C contém alguns operadores essenciais que podem ser misterioso para alguns leitores. O restante inteiro ou operador mod é denotada%. Os operadores lógicos and e or que aparecem em declaração condicional são denotadas && e ||, respectivamente.

1.2.1 Linguagens de Programação

As quatro linguagens suportadas pelo juiz foram concebidas em momentos diferentes, com diferentes objetivos em mente:

• Pascal - O mais popular linguagem de programação educacional da década de 1980, Pascal foi criada para incentivar as programação estruturada. Sua popularidade tem erosada quase ao ponto da extinção, mas que mantém uma posição elevada em escolas e na Europa Oriental.

• C - A língua original do sistema operacional UNIX, C foi concebida para proporcionar programadores experientes com o poder de fazer o que precisa ser feito. Isto inclui o poder de enforcar-te pelos pontos de referência inválidos e tipo inválido de conversão. Evolução na programação orientada a objeto, durante a década de 1990 para liderar o novo e melhorado. . .

• C++ - O primeiro êxito comercial orientado a objeto puxado para fora da linguagem pura truque de manter retrocompatibilidade com C ao mesmo tempo que incorpora dados novos mecanismos de captação e herança. C++ se tornou a principal linguagem de programação para o ensino ea indústria em meados dos anos 1990 à tarde, mas agora ele parece mais com o seu ombro. . .

• Java - Concebido como uma linguagem de apoio a programas móvel, Java possui mecanismos de segurança especiais para evitar erros comuns, como programador array out-of-bounds violações e ilegal ponteiro acesso. É um full-featured linguagem de programação que pode fazer tudo que os outros podem e mais.



Tabela 1.1. O juiz da veredictos pela Programação Language (até dezembro de 2002).

Note que cada uma das linguagens de programação do juiz tem compilador e idiossincrasias específicas de cada sistema. Assim, um programa que é executado em sua máquina não pode ser executado no juiz. Leia a linguagem do juiz observa em seu site cuidadosamente para minimizar o problema, especialmente se você estiver usando o Java.

É interessante olhar para os idiomas que as pessoas têm vindo a utilizar. Em dezembro de 2002 mais de 1250000 programa observações foram enviadas para o robô juiz. Quase metade deles estavam em C++, com quase outro terço em C. Apenas uma ínfima parte foi escrito em Java, mas isso não é justo um teste uma vez que o juiz não aceita programas Java até Novembro de 2001.

Estas observações são discriminadas por mês na Figura 1.1. C revelou a mais popular linguagem até finais de 1999, quando subiu à frente C++. É interessante notar a espiga anual na procura cada queda como treinar os alunos para o ACM International Collegiate Programming Contest competições regionais. Todos os anos, o juiz recebe busier, à medida que mais e mais alunos procuram o seu julgamento em tribunal.

É também interessante olhar para o juiz da veredictos pela linguagem de programação. Estes são tabuladas na Tabela 1.1, de acordo com os códigos de resposta descrita na secção 1.1.3. Os veredictos são bastante consistentes em toda a bordo. No entanto, a frequência de certos tipos de erros parecem ser dependentes da linguagem. C++ programas executados fora do tempo e da memória mais frequentemente do que programas em linguagem C, um sinal de que C++ é um parente recurso porco. C tem uma taxa ligeiramente maior aceitação do que C++, provavelmente refletindo a sua popularidade em um estado anterior em que o juiz do desenvolvimento. Pascal tem a menor taxa de erros restrito função, reflectindo as suas origens como uma agradável e segura linguagem para os estudantes com quem brincar. Java tem tido muito mais do que a sua quota de compilador erros até à data, mas também se choca muito menos vezes do que as outras línguas. A segurança é, de facto, uma virtude.

Mas a lição básica é que os os utilitários não fazem o homem. Sua linguagem não resolve os problemas - você o faz.

1.2 Escolhendo sua arma

Que linguagem de programação que você deve usar em suas batalhas com o juiz? Muito provavelmente, a língua que sabem melhor. O juiz aceita atualmente programas escrito em C, C + +, Pascal e Java, para que o seu idioma favorito é provavelmente disponível. Uma linguagem de programação pode muito bem ser melhor que outra para uma tarefa específica de programação. No entanto, esses problemas ensaio geral para a resolução de problemas muito mais do que habilidades portabilidade, modularidade, ou eficiência, que são as dimensões usuais pelos quais as línguas são comparadas.

Submissões por mês pela Linguagem de Programação



Figura 1.1. Submissçoes de Linguagens de Programação pelo juiz Robô até Dezembro de 2002.

1.1.3 Opinião do juiz

Os alunos devem estar cientes de que ambos os juízes são frequentemente muito exigente, como o que denota uma solução correcta. É muito importante para interpretar o problema especificações corretamente.

Nunca faça um pressuposto de que não é mencionado explicitamente no especs. Não há absolutamente nenhuma razão para crer que a entrada está classificado, os gráficos estão conectados, ou que o utilizado em um problema inteiros são positivos e razoavelmente pequena, a menos que declara-lo no
especificação.

Tal como os humanos juízes do ACM International Collegiate Programming Contest, o juiz online oferece-lhe muito pouco feedback sobre o que está errado com o seu programa. O juiz é provável o regresso de uma das seguintes sentenças:

• Aceite (AC) - Parabéns! Seu programa está correto, e é executado dentro do tempo e da memória limites.

• Apresentação de erro (PE) - Seu programa de realizações que são correctas, mas não são apresentadas no formato especificado. Verificar a existência de espaços, para a esquerda / direita justificação, linha alimentos, etc

• Aceite (PE) - Seu programa tem uma pequena apresentação de erro, mas o juiz é deixá-lo fora com uma advertência. Não se preocupe, porque muitos problemas têm pouco ambígua saída especificações. Normalmente, os problemas são algo tão banal como um extra em branco no final de uma linha, para parar por aqui e declarar vitória.

• Resposta incorreta (WA) - Este você deve preocupar-te, porque o seu programa retornou uma resposta incorrecta para uma ou mais das julgar casos secretos do teste. Você tem que fazer mais alguma depuração.

• Compile Error (CE) - O compilador não puderam descobrir como compilar o seu programa. O compilador resultante mensagens serão devolvidos a você. Aviso mensagens que não interfiram com a compilação são ignoradas pelo juiz.

• Runtime Error (RE) - Seu programa falhou durante a execução devido a um segmentation fault, exceção de ponto flutuante, ou problema semelhante. Sua mensagem será enviada morrendo de volta para você. Check for invalid ponteiro referências ou divisão por zero.

• Time Limit Exceeded (TL) - Seu programa teve muito tempo em pelo menos um dos casos de teste, então você provavelmente tem um problema com eficiência. Só porque você acabou de vez em uma entrada não significa que você estava correto em todos os outros, no entanto!

• Memória Limit Exceeded (ML) - Seu programa tentou usar mais memória do que o juiz da predefinições.

• Saída Limit Exceeded (OL) - Seu programa tentou imprimir muita saída. Isso normalmente significa que está preso em um loop infinito.

• Restrita Função (RF) - Sua fonte programa tentou usar um sistema ilegal, como a função fork () e fopen (). Comporte-se.

• Apresentação Erro (SE) - Você não especificar corretamente um ou mais campos da informação, talvez dando um usuário ID incorreto ou problema número.

Só para reiterar: se o seu programa é considerado culpado de ter uma resposta errada, o juiz não vai te mostrar o que ele falhou no teste caso, ou dar-lhe quaisquer sugestões de que ele falhou. É por isso que é tão essencial para a revisão das especificações cuidadosamente. Mesmo quando você pode ter certeza que seu programa está correto, o juiz pode manter a dizer não. Talvez você está esquecendo um caso fronteira ou assumindo algo que não é assim. Como reenviar o programa sem alterar você faz absolutamente nada. Leia o problema novamente para ter certeza de que ele diz o que você pensou que fez.

O juiz ocasionalmente retorna um veredicto mais exóticos que é essencialmente independente de sua solução. Consulte o site adequado para obter mais detalhes.

1.1.2 O juiz robô da Universidade de Valladolid

Todos os problemas neste livro e muitos mais aparecem no robô juiz da Universidade de Valladolid http://online-judge.uva.es, a maior coleção de problemas de programação no mundo. Encorajamos qualquer pessoa cujo apetite tem sido "amolado" por nossos desafios para continuar os seus estudos lá.

Após registrar-se no UVA juiz, você receberá e-mail contendo um número de identificação que irá identificar os seus programas para o juiz. Você precisará deste número de identificação para cada solução que você enviar.

O juiz UVA está gradualmente 'adotando' uma interface web, mas atualmente usa email apresentação. As soluções são enviadas diretamente para judge@uva.es depois de terem sido anotados com informação suficiente para dizer que o juiz problema que você está tentando resolver, que o autor é, e aquilo que você está usando linguagem de programação.

Especificamente, cada programa apresentado deve conter uma linha (em qualquer local) com um @ JUDGE ID: campo. Normalmente, esta linha é colocada dentro de um comentário. Por exemplo,

/ * @ JUDGE_ID: 1000AA 100 C "Dynamic Programming" * /

O argumento depois do @ JUDGE ID: é o seu ID do usuário (no exemplo 1000AA). Isto é seguido pelo problema número (100 no exemplo) e, em seguida, pela linguagem utilizada.

Certifique-se de usar o número de identificação para todos os UVA observações a este juiz! Maiúsculas e minúsculas são indistinguíveis. Se você não especificar a linguagem de programação, o juiz tentará auto-detectar-lo - mas porque jogar? Finalmente, se você tiver usado qualquer interessante algoritmo ou método, você pode incluir uma nota nesse sentido entre aspas, como a programação dinâmica, no caso do exemplo acima.

Separando seu programa, com início / fim de observações fonte é uma boa maneira de ter certeza de que o juiz não é confundido por junk anexado pelo seu mailer.

/ * @ BEGIN_OF_SOURCE_CODE * /
o seu programa aqui
/ * @ END_OF_SOURCE_CODE * /

Certos erros misteriosa irá para quando você fizer isto.

1.1.1 O juiz robô do Desafios de Programação

O site Desafios de Programação (http://www.programming-challenges.com) pró-fornecem características específicas associadas a cada um dos problemas neste livro. Por exemplo, uma descrição de cada desafio que aparecem no livro é dada no local, juntamente com down-carregável ficheiros de entrada e saída para eliminar a necessidade para você digitar esses dados testes.

O site Desafios de Programação utiliza uma interface web para a apresentação (o Enviar-o-Matic) em vez da interface do e-mail UVA juiz. Isto torna a apresentação muito mais fácil e mais fiável, e prevê a resposta mais rápida.

Cada problema neste livro tem dois números de identificação de associados, um para cada juiz. Uma vantagem da interface web é que o identificador para a O site Desafios de Programação (o PC ID) não é necessária para a maioria das observações. O problema descrições neste livro foram reescritas para a clareza; assim, eles são muitas vezes diferentes das descrições sobre o UVA juiz em menor maneiras. No entanto, os problemas que eles descrevem são idênticos.

Assim, qualquer solução pontuadas como corretas sobre um juiz deverá ser pontuada corretas sobre os outros tão bem.

O site Desafios de Programação tem uma interface de gerenciamento especial, o que permite que um instrutor de manter uma lista de alunos em cada turma e ver as suas observações e resultados. Ele também contém um programa semelhança testador assim o instrutor pode verificar que as soluções são, na verdade, cada aluno apresenta o seu próprio trabalho. Assim, torna-se "mau carma" de caça de soluções na web ou no seu colega de diretórios.

1.1 Começando com o juiz

Este livro foi concebido para ser utilizado em conjunto com um (ou ambos) de dois robô julgar websites. O juiz Desafios de Programação http://www.programming-challenges.com foi criado especificamente para ajudá-lo a obter o máximo de desafios neste livro.

O juiz da Universidade de Valladolid http://online-judge.uva.es tem uma interface diferente, bem como centenas de problemas adicionais disponíveis.

Todos os problemas no livro podem ser julgados a partir de qualquer site, que são ambos administradas por Miguel Revilla. Nesta seção, descrevemos como usar os dois juízes e explicar as diferenças entre eles. Esteja ciente de que ambos os sites estão vivendo, respirando projetos, de forma que estes procedimentos podem evoluir ao longo do tempo. Verifique as instruções atuais em cada local para esclarecimentos.

Sua primeira tarefa é fazer uma conta para o juiz de sua escolha. Você será solicitado a fornecer uma senha de acesso aos seus dados pessoais, especificamente o seu nome e seu endereço de email. Se você esquecer sua senha, clicando no botão apropriado será obtê-lo por e-mail de volta para você.

Note que o contestante rosters dos dois sites são mantidos atualmente distintos, mas não há nenhuma razão para você não deve registrar-se para tanto deles e desfrutar das suas vantagens distintas.

1. Primeiros passos

Nós lançamos este livro com uma coleção de problemas relativamente elementares de programação, nenhum dos quais exigem idéias mais avançadas do que arrays e iteração.

Elementar, não significa necessariamente fácil, no entanto! Estes problemas constituem uma boa introdução à exigente natureza do robô juiz, bem como a necessidade de ler com atenção e compreender especificações. Proporcionam também uma oportunidade para discutir programação estilos mais adequados para obter o trabalho feito.

Para ajudá-lo a começar, nós iniciaremos com uma descrição do robô juízes e suas idiossincrasias. Seguimos com uma discussão de base estilo de programação e estruturas de dados, antes de introduzir o nosso primeiro conjunto de problemas. Como em todos os capítulos deste livro, seguimos com dicas para os problemas selecionados e as notas para um estudo mais aprofundado.