1 VI Olimpíada de Programação – Junho/2011 Regras de Funcionamento – Nível 2 1. As questões serão anunciadas no início da Olimpíada, às 08h30min. Os participantes terão 3 horas para apresentar soluções, na forma de implementação desenvolvida em qualquer dos compiladores previstos: C++ DEV-C++, C DEV-C++, C++ Visual C++, JAVA, GCC e G++. 2. A prova deverá ser resolvida individualmente. 3. Os trabalhos serão avaliados por um júri formado por professores do INATEL. 4. Quando um participante julgar que tem um programa que resolve um problema, deverá submetê-lo à correção dos juízes, que compilarão e executarão o mesmo para uma bateria de testes desconhecida dos participantes. Um problema será considerado resolvido se, para todos os testes da bateria, devolver o resultado esperado pelos juízes. Para cada submissão o participante receberá uma resposta, que poderá ser satisfatória (e o problema está resolvido) ou indicará algum erro: resposta errada, tempo de execução excedido, erro de execução, erro de compilação, etc. 5. Será considerado vencedor aquele que resolver a maior quantidade de problemas nas 3 horas de competição. Empates no número de problemas resolvidos serão classificados pelo tempo corrigido. Ganhará aquele que tiver o menor tempo corrigido. O tempo corrigido será dado pela soma dos tempos corrigidos somente dos problemas corretamente resolvidos pelo participante. O tempo corrigido de um problema será dado pelo número de minutos decorridos desde o início da competição até o momento da submissão correta somado a uma penalidade de 20 minutos por submissão incorreta feita anteriormente neste problema. Em caso de empate, será considerado vencedor o participante que tiver a primeira submissão correta. Persistindo o empate, a organização fará um sorteio entre os participantes envolvidos. 6. A organização da competição será responsável pela decisão de qualquer caso não previsto. 7. Material permitido para consulta: qualquer material impresso (livros, apostilas, códigos impressos, etc.), e a ajuda (help) do sistema. 8. Não será permitido o uso da internet nem de qualquer dispositivo de armazenamento eletrônico de dados (disquetes, pendrives, etc.). 9. Os participantes inscritos permitirão o uso e divulgação dos programas submetidos pela organização da competição. 10. Para fins de validação de AC (Atividades Complementares), o participante deverá submeter pelo menos uma solução correta. 2 VI Olimpíada de Programação – Junho/2011 A - Contador de Dígitos Arquivo fonte: digito.c, digito.cpp ou digito.java Diana irá escrever uma lista com todos os inteiros positivos entre A e B, inclusive, sem zeros à esquerda. Ela quer saber quantas vezes cada dígito será utilizado. Entrada Cada caso de teste terá uma única linha contendo dois inteiros A e B (1 A B 108). O último caso de teste é seguido de uma linha contendo dois zeros. Saída Para cada caso de teste escreva uma única linha na saída com 10 inteiros representando o número de vezes que cada dígito é utilizado. Escreva a quantidade para cada dígito em ordem crescente de 0 a 9. Exemplos Entrada de entrada: 19 12 321 5987 6123 12345678 12345679 00 Saída para o exemplo de entrada: 0111111111 61 169 163 83 61 61 61 61 61 61 134 58 28 24 23 36 147 24 27 47 0222222211 3 VI Olimpíada de Programação – Junho/2011 B - Homens das Cavernas Arquivo fonte: cavernas.c, cavernas.cpp ou cavernas.java Java é um valente homem das cavernas. Toda semana Java sai para caçar, porém ultimamente tem ficado muito incomodado, pois acha que têm trago menos animal. Vendo sua inquietação, sua filha Lua deu a ideia de registrar a cada caça o número de animais capturados. Porém para fazer isto eles precisam de sua ajuda, já que cada um só consegue contar até cinco utilizando uma de suas mãos. Entrada A entrada é composta de vários casos de teste. Cada caso de teste possui uma única linha contendo dois inteiros J e L (0 ≤ J,L ≤ 5) representando a contagem feita por Java e a feita por Lua respectivamente. A entrada termina quando J e L são iguais a 0. Saída Para cada caso de teste seu programa deve imprimir uma linha com a soma dos animais contados por Java e Lua. Exemplos Exemplo de entrada: 05 11 30 25 00 Saída para o exemplo de entrada: 5 2 3 7 4 VI Olimpíada de Programação – Junho/2011 C - Sapateiro Arquivo fonte: sapateiro.c, sapateiro.cpp ou sapateiro.java O sapateiro Zé tem N reparos a serem feitos. Zé só pode trabalhar em um reparo por dia. Cada reparo i tem um inteiro Ti (1 ≤ Ti ≤ 1000), que representa o número de dias necessários para ser finalizado. Para cada dia de delay antes de começar o i-ésimo reparo, Zé deve pagar uma multa de Si (1 ≤ Si ≤ 10000) centavos. Sua tarefa é ajudar o Zé, escrevendo um programa que encontre a sequência de reparos com o mínimo total de multas. Entrada A entrada começa com um inteiro positivo indicando o número de casos de teste. A primeira linha de cada caso de teste contém um inteiro N (1 ≤ N ≤ 1000) que representa o número de reparos. As próximas N linhas contém cada uma dois inteiros: o tempo e a multa de cada reparo. Saída Seu programa deve imprimir a sequência de reparos com o total mínimo de multas. Cada reparo deve ser representado pelo número que representa sua ordem de entrada, ou seja, o primeiro pelo número 1, o segundo pelo 2, e assim por diante até o reparo N. A sequência deve ser escrita em apenas uma linha com os números dos reparos separados por um único espaço. Se mais de uma solução é possível, imprima a que aparece primeiro em ordem lexicográfica. Após cada sequência você deve deixar uma linha em branco. Obs: Ordem lexicográfica: X1 ≤ X2 ≤ X3... XN Exemplos Exemplo de entrada: 2 4 34 1 1000 22 55 5 89 11 9 12 19 89 12 19 Saída para o exemplo de entrada: 2134 <linha em branco> 35142 <linha em branco> 5 VI Olimpíada de Programação – Junho/2011 D - Super Mario Arquivo fonte: mario.c, mario.cpp ou mario.java Mario está no ultimo castelo. Agora só precisa pular sobre algumas paredes para entrar na câmara do Koopa, onde terá que derrotá-lo para salvar a princesa. Para este problema, estamos apenas preocupados com a parte de pular os muros. Serão fornecidas as alturas de N paredes da esquerda para a direita. Mario está atualmente na primeira parede. Ele precisa pular para as paredes adjacentes uma após a outra até chegar à última, ou seja, dará (N-1) pulos. Um pulo alto é quando Mario tem que pular para uma parede mais alta, e similarmente, um pulo baixo é quando Mario precisa pular para uma parede mais baixa. Você é capaz de descobrir o número total de pulos altos e pulos baixos que Mario dará. Entrada A primeira linha da entrada é um inteiro T (T < 30) que indica o número de casos de testes. Cada caso de testes começa com um inteiro N (0 < N < 50) que determina o número de paredes. A próxima linha contém a altura das N paredes, da esquerda para a direita. Cada altura é um inteiro positivo menor ou igual a 10. Saída Para cada caso de teste, escreva o número do teste seguido de dois inteiros: o total de pulos altos e o total de pulos baixos, respectivamente. Olhe o exemplo de saída para o formato exato. Exemplos Exemplo de entrada: 3 8 14223534 1 9 5 12345 Saída para o exemplo de entrada: Caso 1: 4 2 Caso 2: 0 0 Caso 3: 4 0 6 VI Olimpíada de Programação – Junho/2011 E - Pangram Arquivo fonte: pangram.c, pangram.cpp ou pangram.java “Pangram Show” é um novo programa de TV que oferece bons prêmios para quem detectar corretamente se uma sentença é um pangram. Um pangram é uma sentença que contém pelo menos uma das 26 letras do alfabeto inglês. São exemplos de pangram: the quick brown fox jumps over a lazy dog jackdaws loves my big sphinx of quartz Cada competidor precisa indicar se cada sentença é um pangram ou não. Sua tarefa é escrever um programa para facilitar este trabalho. Entrada A entrada é composta por vários casos de teste. Cada caso de teste é dado em uma única linha que contém uma string não nula de no máximo 200 caracteres. As palavras das sentenças são separadas por um único espaço. Apenas letras minúsculas do alfabeto inglês e espaços aparecem em cada linha da entrada. O último caso de teste é seguido de uma linha que contém um único asterisco. Saída Para cada caso de teste seu programa deve escrever uma única linha contendo um ‘Y’ se a sentença é um pangram ou um ‘N’ caso contrário. Exemplos Exemplo de entrada: jackdawf loves my big quartz sphinx abcdefghijklmnopqrstuvwxyz hello world * Saída para o exemplo de entrada: Y Y N 7 VI Olimpíada de Programação – Junho/2011 F - Irmãos Arquivo fonte: irmaos.c, irmaos.cpp ou irmaos.java O reino de ACM era comandado por um grande Rei que era obcecado por ordem. O reino tinha forma retangular, e o rei dividiu o território em uma grade de pequenos países retangulares. Antes de morrer, o Rei distribuiu os países entre seus filhos. No entanto, ele não sabe que seus filhos desenvolveram uma estranha rivalidade; o primeiro herdeiro odiava o segundo herdeiro, mas não os demais; o segundo herdeiro odiava o terceiro herdeiro, mas não os demais, e assim por diante. Finalmente, o último herdeiro odiava o primeiro herdeiro, mas não os demais. Logo que o Rei morreu, essa estranha rivalidade entre os filhos do Rei desencadeou uma guerra generalizada no reino. Os ataques ocorriam apenas entre pares de países adjacentes (que compartilham uma borda vertical ou horizontal). Um país X atacava um país adjacente Y sempre que o proprietário de X odiava o proprietário de Y. O país atacado era sempre conquistado pelo irmão atacante. Por uma questão de honra, todos os ataques aconteciam simultaneamente, e um conjunto de ataques simultâneos recebia o nome de batalha. Após certo número de batalhas, os filhos sobreviventes assinaram um tratado de trégua e nunca mais batalharam. Por exemplo, se o Rei tinha três filhos (0, 1 e 2) a figura abaixo mostra o que acontece na primeira batalha dada uma distribuição inicial das terras: Você foi contratado para ajudar um historiador da ACM a determinar, dados o número de herdeiros, a distribuição inicial de territórios e o número de batalhas, qual a distribuição final de territórios após as batalhas. Entrada A entrada contém vários casos de teste. A primeira linha de um caso de teste contém quatro inteiros N, R, C e K separados por um espaço em branco. N é o número de herdeiros (2 ≤ N ≤ 100), R e C são as dimensões do reino (2 ≤ R,C ≤ 100) e K é o número de batalhas (1 ≤ K ≤ 100). Herdeiros são identificados por inteiros de 0 até N-1. Cada uma das seguintes R linhas contém C inteiros Hr,c separados por um espaço em branco, representando a distribuição inicial de terras: Hr,c é o proprietário inicial do país na linha r e coluna c (0 ≤ Hr,c ≤ N-1). O último caso de teste é seguido de uma linha contendo quatro zeros separados por um espaço em branco. Saída Para cada caso de teste, seu programa deve imprimir R linhas com C inteiros cada, separados por um espaço em branco, no mesmo formato da entrada, representando a distribuição das terras após todas as batalhas. 8 VI Olimpíada de Programação – Junho/2011 Exemplos Exemplo de entrada: 3443 0120 1020 0120 0122 4234 103 212 8421 07 16 25 34 0000 Saída para o exemplo de entrada: 2220 2101 2220 0200 103 212 76 05 14 23 9 VI Olimpíada de Programação – Junho/2011 G - O Cachorro e a Toupeira Arquivo fonte: cachorro.c, cachorro.cpp ou cachorro.java Em um campo grande há um cachorro e uma toupeira. O cachorro quer comer a toupeira, enquanto a toupeira quer correr com segurança através de um dos vários buracos cavados na superfície do campo. Nem o cachorro e nem a toupeira são mestres da matemática, porém, nenhum é totalmente estúpido. A toupeira escolhe um buraco e corre em linha reta a uma velocidade fixa. O cachorro, que é muito bom em linguagem corporal, antecipa qual o buraco escolhido pela toupeira e corre com o dobro da velocidade da toupeira para o buraco, onde pretende pega-la. Se o cachorro chegar primeiro a toupeira será capturada, caso contrário conseguirá escapar. Você deve selecionar um buraco para a toupeira escapar, se tal buraco existir. Entrada A entrada é composta por vários casos de teste. A primeira linha de cada caso de teste contém um inteiro N que representa o número de buracos. A segunda linha contém quatro números reais que representam as coordenadas (x,y) da toupeira seguidas das coordenadas (x,y) do cachorro. As próximas N linhas contém cada uma dois números reais representando as coordenadas (x,y) de um buraco. A entrada termina quando N = 0. Saída Seu programa deve escrever uma única linha para cada caso de teste. Se a toupeira consegue escapar a saída deve ser: “A toupeira pode escapar pelo buraco (x,y).” sem aspas. Se existir mais de um buraco em que a toupeira possa escapar seu programa deve apresentar o que primeiro apareceu na entrada. Caso não haja como escapar a saída deve ser: “A toupeira nao pode escapar.” sem aspas e sem acento no ‘nao’. Não há mais do que 1000 buracos em cada teste e as coordenadas estão entre -10000 e +10000. Exemplos Exemplo de entrada: 1 1.000 1.000 2.000 2.000 1.500 1.500 2 2.000 2.000 1.000 1.000 1.500 1.500 2.500 2.500 0 Saída para o exemplo de entrada: A toupeira nao pode escapar. A toupeira pode escapar pelo buraco (2.500,2.500). 1 0 VI Olimpíada de Programação – Junho/2011 H - Reciclagem Arquivo fonte: reciclagem.c, reciclagem.cpp ou reciclagem.java Reciclar vidros requer que os vidros sejam separados pela cor em uma das três categorias: marrons, verdes e brancos (claros). Neste problema você receberá três sacos recicláveis, cada um contendo um número específico de garrafas marrons, verdes e brancas. Para que sejam recicladas, as garrafas precisarão ser movidas de forma que cada saco contenha garrafas de apenas uma cor. O problema é minimizar o número de garrafas a serem movidas. Você pode considerar que os sacos são enormes, de modo que não têm limite de quantidade. O número total de garrafas nunca irá exceder 231. Entrada A entrada é composta por vários casos de testes. Cada caso de teste contém uma única linha com nove inteiros. Os primeiros três inteiros representam o número de garrafas marrons, verdes e brancas (respectivamente) no saco número 1, os três números seguintes representam o número de garrafas marrons, verdes e brancas no saco número 2, e os últimos três números representam o número de garrafas marrons, verdes e brancas no saco número 3. Por exemplo, a linha 10 15 20 30 12 8 15 8 31 indica que há 10 garrafas marrons no saco 1, 12 garrafas verdes no saco 2, e 31 garrafas brancas no saco 3. O último caso de teste é seguido por uma linha com 9 zeros. Saída Para cada caso de teste seu programa deve imprimir uma linha indicando as cores de garrafas de cada saco e o número mínimo de movimentos. Por questões de internacionalização você deve escrever as iniciais de cada cor em inglês: ‘G’ para garrafas verdes (green), ‘B’ para garrafas marrons (brown) e ‘C’ para garrafas brancas (clear). A linha de resposta deve ser no formato: XYZ M, onde X é a letra inicial da cor das garrafas do primeiro saco, Y do segundo saco e Z do terceiro. O X é um inteiro representando o número mínimo de movimentos. Se mais de uma ordem de cores possuem o número mínimo de movimentos, então a que vier primeiro em ordem alfabética deve ser utilizada. Exemplos Exemplo de entrada: 123456789 5 10 5 20 10 5 10 20 10 000000000 Saída para o exemplo de entrada: BCG 30 CBG 50