1 VIII Olimpíada de Programação Regras de Funcionamento 1. As questões serão anunciadas no início da Olimpíada, às 8h00min. 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 automaticamente pelo sistema BOCA. 4. Quando um participante julgar que tem um programa que resolve um problema, deverá submetê-lo à correção do juiz eletrônico, que compilará e executará 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 pelo juiz. 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. 2 VIII Olimpíada de Programação A – Bolas de Canhão Arquivo fonte: bolas.c, bolas.cpp ou bolas.java Enquanto WALL•E limpava e organizava a Terra despopulada, encontrou um memorial de gerras civis. Ao agrupar as bolas de canhão em um único lugar ele decidiu utilizar pirâmides com bases triangulares ao invés das quadradas. Uma pirâmide com três lados também é conhecida como tetraedro. Dado o número de bolas de canhão em cada lado da base, compute o número total de bolas que formarão a pirâmide. Entrada A primeira linha contém um único número inteiro N representando o número de pirâmides que serão formadas. As próximas N linhas serão compostas por um único inteiro representando o número de bolas de canhão que serão utilizadas em cada lado da base da pirâmide. Saída Para cada pirâmide seu programa deverá imprimir o número da mesma, começando em 1, seguido de ‘:’ (dois pontos), seguido de um espaço, seguido do número de bolas utilizadas em cada lado da base, seguido de outro espaço e finalmente o número total de bolas do tetraedro. Exemplos Exemplo de entrada: Saída esperada: 6 1 2 3 5 27 999 1: 2: 3: 4: 5: 6: 1 1 2 4 3 10 5 35 27 3654 999 166666500 3 VIII Olimpíada de Programação B – Horas e minutos Arquivo fonte: horas.c, horas.cpp ou horas.java Dudu tem um relógio analógico no formato de um circulo como o da figura abaixo. Dois ponteiros giram ao redor do centro indicando as horas e minutos. O relógio tem 60 marcas colocadas ao redor do seu perímetro com uma distância constante entre si. O ponteiro de minutos se move da marca corrente para a próxima exatamente uma vez a cada minuto. O ponteiro das horas se move da marca corrente para a próxima exatamente uma vez a cada 12 minutos, portanto ele avança 5 marcas a cada hora. Considere que ambos os ponteiros se movem de forma discrete e instantânea, o que significa que eles estão sempre posicionados exatamente em cima de uma das marcas e nunca entre elas. Dudu adora geometria e gosta de medir o ângulo mínimo entre os dois ponteiros em diferentes horas do dia. Ele vem anotando algumas medidas, porém depois de vários anos e uma extensa lista, ele percebeu que alguns angulos foram repetidos, enquanto outros nunca apareceram. Por exemplo, a lista de Dudu indica que tanto às 3 horas quanto às 9 horas o ângulo mínimo entre os dois ponteiros é 90 graus, enquanto um ângulo de 65 graus não aparece na lista. Dudu decidiu verificar, para cada número inteiro A entre 0 e 180, se existe pelo menos um momento do dia que o ângulo mínimo entre os dois ponteiros do relógio é exatamente A graus. Você pode ajudá-lo com um programa que responda esta pergunta? Entrada Cada caso de teste é descrito em uma única linha. Cada linha de teste contém um inteiro A representando o ângulo a ser verificado. O final da entrada é indicado por uma linha contendo o número -1. Saída Para cada caso de teste imprima uma linha contendo o caractere ‘Y’ se existir pelo menos um momento do dia em que o ângulo minimo entre os ponteiros do relógio é exatamente A graus e ‘N’ caso contrário. Exemplos Exemplo de entrada: 90 65 66 67 128 0 180 -1 Saída para o exemplo de entrada: Y N Y N N Y Y 4 VIII Olimpíada de Programação C – Flores de Fogo Arquivo fonte: flores.c, flores.cpp ou flores.java Nos dias atuais uma flor de fogo não é algo considerado estranho para muitos jovens. Isso porque um famoso jogo de videogame popularizou esse tipo de flor. Nesse jogo o protagonista ganhava superpoderes ao tocar em uma flor de fogo, passando a atirar pequenas bolas de fogo para derrotar seus inimigos. No entanto, já se falava sobre flores de fogo há muito tempo atrás. Na mitologia polonesa, flores de fogo são flores místicas de grande poder guardadas por espíritos malignos. Ela possuía esse nome porque brilhava tanto que era impossível olhá-la diretamente. Quem possuísse uma flor dessas ganharia a habilidade de ler a mente de outras pessoas, encontrar tesouros escondidos e repelir todos os males. Para obter uma flor de fogo, a pessoa deveria procurá-la em uma floresta antes da meia-noite na véspera do Noc Kupały. Exatamente à meia-noite ela floresceria. Para colhê-la seria preciso desenhar um círculo em volta dela. Parece uma tarefa fácil, no entanto, os espíritos malignos que guardam a flor tentariam de tudo para distrair qualquer um tentando colher a flor. Se a pessoa falhasse ao tentar desenhar um círculo em volta da flor, teria sua vida sacrificada. Dados dois círculos, um desenhado por um ambicioso caçador de flores de fogo e outro representando a área da flor, sua tarefa é determinar se o caçador morre ou fica rico com sua conquista. Entrada A entrada é composta por diversos casos de testes. Cada caso consiste em uma linha com seis inteiros, R1, X1, Y1, R2, X2, Y2. O círculo desenhado pelo caçador possui raio R1 e centro (X1; Y1). O círculo representando a área da flor possui raio R2 e centro (X2; Y2). A entrada termina com uma linha contendo seis números 0 (zero). Saída Para cada caso de teste imprima uma única linha contendo ‘MORTO’, se o caçador morre, ou ‘RICO’ se o caçador consegue colher a flor. Exemplos Exemplo de entrada: 6 -8 2 3 0 0 7 3 4 2 4 5 3 0 0 4 0 0 5 4 7 1 8 7 0 0 0 0 0 0 Saída para o exemplo de entrada: MORTO RICO MORTO RICO 5 VIII Olimpíada de Programação D – Trabalho do Papa Arquivo fonte: papa.c, papa.cpp ou papa.java Karol Wojtyła nasceu em Wadowice em 1920, foi eleito papa João Paulo II em 1978 e morreu em 2 de abril de 2005 após completar 26 anos de pontificado. Foi um dos poloneses mais importantes da História. Antes de se tornar religioso, durante a segunda grande guerra, Wojtyla trabalhou em uma fábrica de produtos químicos. Uma das tarefas de Wojtyła era acomodar os pacotes de produtos químicos em pilhas para transportá-los. O problema surgia do fato de que alguns destes pacotes eram muito pesados, e outros tinham pouca resistência a ter peso sobre eles. Os gerentes da fábrica sempre desejavam pilhas grandes, com o maior número possível de caixas. Todas as caixas tinham associados dois números: seu peso em quilos e o peso, também em quilos, que era capaz de suportar (incluindo o peso da caixa). Assim, uma caixa de 25 quilos e resistência de 60 quilos era capaz de suportar no máximo 35 quilos em cima dela. Sua tarefa é, dada uma lista de caixas, com seus pesos e resistências, determinar o número máximo de caixas que podem ser empilhadas sem ultrapassar a resistência de nenhuma caixa da pilha. Entrada A primeira linha da entrada contém um inteiro T indicando o número de casos de teste. A primeira linha de cada caso contém um inteiro N, indicando o número de caixas. Cada uma das N linhas seguintes contém inteiros P e R, correspondendo, respectivamente, ao peso e resistência de uma caixa. Saída Para cada caso de teste imprima, em uma única linha, o maior número de caixas que podem ser empilhadas nas condições do enunciado. Exemplos Exemplo de entrada: 2 4 13 30 11 15 7 28 6 6 3 43 60 47 100 3 2 Saída para o exemplo de entrada: 3 2 6 VIII Olimpíada de Programação E – Terra Média Arquivo fonte: terra.c, terra.cpp ou terra.java A Terra Média está para entrar em guerra. As forças do bem terão várias batalhas contra as forças do mal. Certamente teremos várias raças envolvidas. Cada raça tem um peso diferente na batalha. Do lado do bem temos as seguintes raças com seus pesos associados: Hobbits - 1 Humanos - 2 Elfos - 3 Anões - 3 Eagles - 4 Bruxos - 10 Do lado do mal temos: Orcs - 1 Humanos - 2 Wargs - 2 Goblins - 2 Uruk-Hai - 3 Trolls - 5 Bruxos - 11 Embora o tempo, o local, suprimentos e valores façam muita diferença em uma batalha, se você somar o peso total do lado do bem e comparar com o peso total do lado do mal, o lado com o maior peso tenderá a vencer. Assim, dados a quantidade de cada raça do bem, seguida pela quantidade de cada raça do mal, determine qual lado é o vencedor. Entrada A primeira linha da entrada irá conter um inteiro maior que 0 significando o número de batalhas para processar. As informações para cada batalha serão compostas por duas linhas: a primeira será uma linha contendo 6 números inteiros representando a quantidade de cada raça do bem na mesma ordem apresentada acima; a segunda será composta por 7 números inteiros representando a quantidade de cada raça do mal, também na mesma ordem apresentada acima. Saída Para cada batalha imprima “Batalha X: RESULTADO”, onde ‘X’ representa o número da batalha começando em 1 e ‘RESULTADO’ será a frase ‘O Bem triunfa sobre o Mal’ se o bem vencer, ‘O Mal extermina todos os vestigios do Bem’(sem acento) caso o mal vença ou ‘Sem vitória neste campo de batalha’(sem acento) no caso de empate. 7 VIII Olimpíada de Programação Exemplos Exemplo de entrada: 3 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 10 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 Saída para o exemplo de entrada: Batalha 1: O Mal extermina todos os vestigios do Bem Batalha 2: O Bem triunfa sobre o Mal Batalha 3: Sem vitória neste campo de batalha 8 VIII Olimpíada de Programação F – Gandalf Arquivo fonte: gandalf.c, gandalf.cpp ou gandalf.java Os escritos de Gandalf têm sido estudados há anos, porém ninguém conseguiu descobrir em qual língua eles foram escritos. Recentemente, graças ao trabalho de alguns hackers, descobriu-se que Gandalf usava nada além de um simples esquema de substituição de letras, e consequentemente, a mesma operação poder ser usada para esconder e recuperar a mensagem. Esta operação é realizada trocando vogais na sequência (a i y e o u) com a vogal três vezes a frente, de forma cíclica, preservando o estado (Maiúscula/Minúscula). De forma similar as consoantes são trocadas na sequência (b k x z n h d c w g p v j q t s r l m f) avançando 10 letras. Por exemplo, a frase “One ring to rule them all.” é traduzida para “Ita dotf ni dyca nsaw ecc.”. Você foi contratado para escrever um código que traduza os manuscritos de Gandalf. Entrada A entrada é composta por vários casos de teste. Cada caso de teste será composto por uma única linha contendo até 100 caracteres, representando algum texto escrito por Gandalf. O final da entrada será uma linha contendo um único caractere ‘-‘. Saída Para cada caso de teste da entrada, seu programa deve imprimir a tradução equivalente. Exemplos Exemplo de entrada: Ita dotf ni dyca nsaw ecc. Tywpadh (1234567890) - Saída para o exemplo de entrada: One ring to rule them all. Numbers (1234567890)