VII MARATONA DE PROGRAMAÇÃO UERJ – 17/05/2014 Este caderno contém 12 páginas com a descrição de 10 problemas1 definidos a seguir: A - Botas B – Digito Verificador do passaporte C – Jogo da Vida D - A Próxima Permutação E – Esperando na fila F – Contágio G – Os três cilindros H – Mega-Sena I – Colagem J - Maiores e Menores 1. Resolva os problemas conforme orientação anterior. 2. Tenha muita atenção e calma. Boa sorte. 1 Autoria de Paulo Eustáquio Duarte Pinto e Geovani Aliatti 1 Problema A Botas Em um depósito de botas usadas, os pés de botas estão todos misturados, de forma que não se sabe quantos pares podem ser formados. Você vai ajudar a esclarecer quantos pares existem nesse mistura de pés de botas, escrevendo um programa para tal fim. Entrada Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000) que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste consiste de duas linhas de entrada. Na primeira linha existe um inteiro n (1 ≤ n ≤ 1000), que indica o número de pés de botas existentes no depósito. Na segunda linha existem n inteiros indicando o tamanho das botas ( o valor é positivo se o pé de bota for relativo ao pé esquerdo e é negativo se o pé da bota for um pé direito). Cada um desses valores, em valor absoluto, varia de 20 a 100. Saída Para cada caso de teste imprima um valor p, que indica o número de pares que podem ser formados. Observe que, no caso de teste 1, os três pares de botas que podem ser formados são (35, -35), (40, -40), (40, -40), sobrando os pés -40, 36, 38, 41, que não podem formar pares. Exemplo de entrada 3 10 40 35 -40 -40 -40 36 41 -35 38 40 3 35 36 -37 10 20 -20 30 -30 35 -35 40 -45 50 -55 Saída para o exemplo de entrada 3 0 3 2 Problema B Dígito Verificador do passaporte Dígitos verificadores são caracteres, normalmente numéricos, anexados a um identificador, para ajudar na detecção de algum erro de preenchimento de informações. No caso do passaporte brasileiro, o identificador é formado por nove caracteres (letras maiúsculas, números e o caracter especial ‘<’ ). O dígito verificador é calculado com base modular 10, usando pesos 7, 3, 1. As letras, se houver, são convertidas para números. A letra A é convertida para 10, B para 11 e assim sucessivamente. O caracter ‘<’ é convertido para 0. O cálculo é ilustrado abaixo: Identificador Conversão Multiplicadores Produtos F 15 7 105 9 9 3 27 6 6 1 6 4 4 7 28 1 1 3 3 1 1 1 1 4 4 7 28 F 15 3 45 < 0 1 0 Dígito Verificador = (105+27+6+28+3+1+28+45+0) mod 10 = 243 mod 10 = 3. O cálculo é feito assim: cada caracter do passaporte é convertido para um numero (se o caracter já for um número nada é feito e, se for letra ou ‘<’, é convertido). Em seguida, cada número é multiplicado pelos fatores 7, 3, 1, 7, 3, 1, 7, 3, 1, respectivamente, e o resultado é somado. O resto da divisão por 10 dessa soma é o dígito verificador. Neste problema você vai calcular o dígito verificador de um passaporte dado. Entrada A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000) que indica quantos serão os casos de teste. Cada teste consiste de uma linha contendo 9 caracteres, o identificador de um passaporte brasileiro, contendo números, letras de ‘A’ a ‘Z’ ou o caracter ‘<’. Saída Para cada caso de teste imprima o dígito verificador do número dado. Exemplo de entrada 3 F964114F< FFFF15<<< A01234BB0 Saída para o exemplo de entrada 3 8 8 3 Problema C Jogo da Vida O jogo da vida foi inventado pelo matemático britânico John Horton Conway e simula o desenvolvimento das várias gerações de bactérias (células) que estão distribuídas em uma matriz n x n. Ao final de cada cada geração uma nova população é formada. Algumas das bactérias da geração anterior morrem e novas bactérias nascem, segundo regras descritas abaixo. A figura a seguir ilustra a situação de início de três gerações de uma dada colônia disposta em uma matriz 5 x 5, onde as posições com X indicam a existência de uma célula viva e as posições em branco, uma célula morta.. X X X X X X X X X X X X X X X X X X X X X X X Três gerações de uma colônia de bactérias As regras de reprodução são as seguintes e são aplicadas ao final de uma geração e são aplicadas simultâneamente a todas as posições da matriz: a) uma célula morta com exatamente três vizinhos renasce b) uma célula viva com zero ou um vizinho morre c) uma célula viva com dois ou três vizinhos permanece viva d) uma célula com mais de três vizinhos morre. Observe que os vizinhos de uma posição da matriz são aquelas posições que têm ao menos um ponto em comum com a posição dada. Neste problema você vai simular o jogo da vida. Entrada Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 1000) que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste começa com uma linha com dois valores n e g (1 ≤ n, g ≤ 20) , onde n indica a dimensão da matriz e g a geração quer se quer conhecer. Em seguida vêm n linhas indicando a primeira geração de uma colônia de bactérias. Cada linha contém n caracteres, '.' se a posição for relativa a uma célula morta ou 'X', se célula viva. Saída Para cada teste você deve imprimir a situação inicial da geração g da colônia. Cada saída mostra, em n linhas, a situação da colônia. A convenção de célula viva ou morta é a mesma da entrada. Após cada matriz, imprima uma linha em branco. 4 Exemplo de Entrada 3 5 3 .XXX. .X.X. .XXX. ..... ..... 5 3 XXXXX XXXXX XXXXX XXXXX XXXXX 5 20 ..... ..X.. ..X.. ..X.. ..... Saída para o exemplo de entrada ..... XX.XX .XXX. ..X.. ..... ..... ..... ..... ..... ..... ..... ..... .XXX. ..... ..... 5 Problema D A Próxima Permutação 3 3 3 3 2 2 2 2 4 4 4 4 1 1 1 1 5 5 5 5 7 7 7 7 6 8 8 9 9 6 9 6 8 9 6 8 Jonas aprendeu trabalhar com permutações no curso de MAtemática Discreta e agora está procurando problemas sobre o assunto. Ele sabe que as permutações dos inteiros 1 a n podem ser classificadas pela ordem lexicográfica, onde a comparação de duas permutações é feita da esquerda para a direita, sendo maior aquela que tiver o primeiro valor maior, nessa ordem de comparação. Por exemplo, a menor permutação é (1, 2,... n) e a maior é (n, n-1, ..., 1). Neste problema você vai descobria qual a próxima permutação, na ordem lexicográfica, de uma permutação dada. ENTRADA A primeira linha contém um inteiro, “t”, que corresponde ao número de casos de teste. Cada caso de teste consiste de duas linhas. A primeira delas contem um inteiro n, entre 2 e 1000, o número de elementos da permutação. Na linha seguinte vem n inteiros, correspondendo a uma permutação dos números 1 a n. SAÍDA Para cada caso você deve imprimir uma linha com n inteiros, correspondendo à próxima permutação na ordem lexicográfica, em relação à permutação dada. EXEMPLO DE ENTRADA 3 9 3 2 4 1 5 7 6 9 8 20 1 2 3 4 5 6 7 8 9 10 20 19 18 17 16 15 14 13 12 11 5 15342 EXEMPLO DE SAÍDA 32 4 1 5 7 8 6 9 1 2 3 4 5 6 7 8 9 11 10 12 13 14 15 16 17 18 19 20 15423 6 Problema E Esperando na Fila Ir ao Banco para ser atendido pelos caixas humanos, hoje em dia, é uma experiência pouco agradável, porque cadaq vez existem menos funcionários nas agências. Você vai fazer um estudo para sugerir ao gerente do seu banco qual o número de caixas devem estar funcionando, nos dias de grande movimento. Para tanto, fez uma estatística e quer usar essa estatística, aliada a um parâmetro de atendimento, na determinação do número de caixas ideal. A estatística que você fez indica a hora de entrada de cada cliente, em minutos corridos desde a abertura do banco e o tempo de atendimento no caixa para cada um deles. Você definiu um parâmetro que é o tempo de espera máximo tolerável para cada cliente. Você quer que, para nenhum cliente, o tempo de espera, desde o instante em que entrou no banco até o final do atendimento nunca supere o parâmetro definido. Todos os caixas começam a funcionar no minuto 0 e o banco adota o sistema de fila única. Entrada Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000) que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é descrito em várias linhas. A primeira contém n (0 ≤ n ≤ 100), o número de clientes observados e tmax (10 ≤ t ≤ 30), o tempo de espera máximo tolerável. Em seguida vêm n linhas, uma para cada cliente, contendo o momento da sua chegada ao banco, tc, em minutos corridos (0 ≤ tc ≤ 360) e o tempo de atendimento no caixa, ta, em minutos (1 ≤ ta ≤ tmax). Os dados já vêm ordenados pelo tempo de chegada. Saída Para cada caso de teste imprima o número mínimo de caixas necessários em funcionamento simultâneo, para que nenhum cliente espere mais que o tempo máximo tolerável. Exemplo de entrada 3 2 20 0 15 7 10 3 20 0 20 4 19 15 10 2 20 0 10 0 10 Saída para o exemplo de entrada 1 2 1 7 Problema F Contágio 3 5 6 7 1 9 2 4 8 Sim, o vírus K-- chegou ao país! Esse vírus é muito perigoso e ameaça se alastrar. Ele foi trazido por um grupo de turistas que foi à África. Esse grupo é formado por pessoas de várias cidades. A cada dia ele se espalha para todas as cidades vizinhas de cidades que tenham pessoas infectadas. A Vigilância Sanitária quer fazer uma barreira para esse vírus. Eles querem identificar quantas cidades estarão infectadas após d dias da chegada do vírus. Você deve ajudar a Vigilância Sanitária, fazendo um programa que identifica o número de cidades infectadas, conhecendo a interligação de todas as cidades do país e as cidades iniciais onde o vírus chegou. Entrada Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000) que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é descrito em várias linhas. A primeira contém 4 inteiros: n (1 ≤ n ≤ 1000), o número de cidades do país, m (n-1 ≤ m ≤ 10000),, o número de interligações entre as cidades, c (1 ≤ c ≤ n), o número de cidades inicialmente infectadas e d (0 ≤ d ≤ n), o número de dias que se passaram após a infecção inicial. A seguir vêm n linhas com 2 inteiros indicando todos os pares de cidades interligadas. Finalmente vêm c linhas com um inteiro em cada uma delas, indicando as cidades infectadas. A numeração das cidades é de 1 a n. Saída Para cada caso de teste imprima o número de cidades infectadas no país, após d dias da chegada do vírus. Exemplo de entrada 2 9 10 2 2 13 42 34 53 45 65 76 68 87 89 2 9 4414 12 13 24 34 4 Saída para o exemplo de entrada 8 4 8 Problema G Os três cilindros Djair quer colocar três cilindros de mesmo comprimento e raios diferentes em uma caixa. Todos os cilindros estão apoiados no fundo e os da ponta estão apoiadas na lateral. Djair pode trocar a ordem dos cilindros até conseguir a menor largura possível. Ele quer sua ajuda para calcular qual é essa largura mínima. Vamos lá, ajude-o! Faça um programa para calcular a largura possível, conhecendo-se os raios dos três cilindros. Entrada Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000) que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é descrito em uma linha, contendo três inteiros entre 1 e 100, os raios dos cilindros. Saída Para cada caso de teste imprima a largura mínima que deve ter a caixa. A saída deve ser um número com duas decimais, arredondado. Exemplo de entrada 10 112 123 1 2 10 1 20 20 10 10 10 10 20 40 1 20 100 5 20 50 10 11 12 98 99 100 Saída para o exemplo de entrada 7.66 11.29 20.94 80.00 60.00 126.57 209.44 133.25 65.89 593.99 9 Problema H Mega-Sena Uma das loterias mais populares no Brasil é a Mega-Sena. Ganha quem acertar os 6 números sorteados (sena), porém também existem prêmios para quem acertar 5 (quina) ou mesmo apenas 4 dezenas (quadra). Cada cartão possui 60 números e o apostador pode marcar de 6 a 15 dezenas. A quantidade de apostas de cada cartão corresponde ao número de combinações possíveis com as dezenas marcadas. Por exemplo, se o apostador marcar os números de 1 a 7, ele estará concorrendo com 7 cartões distintos: 1-2-3-4-5-6 1-2-3-4-5-7 1-2-3-4-6-7 1-2-3-5-6-7 1-2-4-5-6-7 1-3-4-5-6-7 2-3-4-5-6-7 Desta forma é possível que uma pessoa ganhe mais de um prêmio com o mesmo cartão. No exemplo acima, se fossem sorteadas as dezenas 1-2-3-4-5-6, o apostador acertaria a sena com a 1ª combinação e seis quinas com as demais. Em breve será lançada uma nova loteria com mais números nos cartões e apostas maiores. A premiação será análoga à da Mega-Sena, isto é, com três faixas de premiação: a principal para quem acertar as “n” dezenas sorteadas e outras duas secundárias para os que acertarem “n-1” e “n-2” números. Os organizadores estão pedindo ajuda para saber quantos prêmios um apostador pode ganhar em cada faixa de premiação em função da quantidade de dezenas apostadas e o número de acertos. Entrada A primeira linha contém um inteiro k igual ao número de casos. A seguir k linhas cada um contendo 3 inteiros: o número de dezenas sorteadas (6 ≤ n ≤ 50), a quantidade de dezenas marcadas no cartão (n ≤ m ≤ n + 30) e o número de acertos (0 ≤ a ≤ n). Saída Para cada caso imprimir uma linha contendo três inteiros, correspondentes à quantidade de prêmios que o apostador tem direito em cada uma das faixas. É garantido que as respostas são inferiores a 231. Exemplo de Entrada 2 676 696 Exemplo de Saída 160 1 18 45 10 Problema I Colagem Ex em plo de Cola gem gem Isabel está aprendendo suas primeiras letras e o dever de casa hoje é recortar textos de jornais para formar algumas palavras. Felizmente na casa da Isabel tem muitos exemplares de um mesmo jornal, de tal forma que ela consegue recortar tudo que precisa. O pai da Isabel ficou pensando qual seria o número mínimo de fragmentos que deveriam ser obtidos para formar as palavras pedidas. Você vai ajudar ao pai da Isabel a responder sua dúvida, fazendo um programa. Entrada Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000) que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é descrito em duas linhas. A primeira linha contém o texto que Isabel precisa obter. A segunda contém o texto completo do jornal disponível. Cada texto tem no máximo 200 caracteres e todos são letras maiúsculas. Saída Para cada caso de teste imprima o número mínimo de fragmentos necessário para formar a palavra pedida. Lembre-se que há tantos exemplares do jornal usado quantos necessários e sempre será possível fazer a tarefa. Exemplo de entrada 2 ARARA ARAMEFARPADO EXEMPLODECOLAGEM EXPLODECORACAOSELVAGEM Saída para o exemplo de entrada 2 5 11 Problema J Maiores e Menores Ollie e Stan estão jogando um jogo envolvendo n bolas. Essas bolas estão em uma caixa e, em cada uma delas, está escrito um inteiro. Eles sorteiam um número k menor ou igual a n/2. Ollie escolhe aleatoriamente k dessas bolas e Stan também escolhe k bolas. Quem ficar com a maior soma ganha o jogo. Joaquim está observando e agora quer saber, dados os valores das n bolas e um valor k, qual a maior soma e qual a menor soma que podem ser obtidas por algum dos jogadores. Você vai fazer um programa para calcular esse máximo e o mínimo. ENTRADA A primeira linha contém um inteiro, “t”, que corresponde ao número de casos de teste. Cada caso de teste consiste de duas linhas. A primeira delas contem dois inteiros: n, entre 2 e 10000, o número de bolas e k, um valor menor ou igual a n/2. Na linha seguinte vêm n inteiros positivos, cujo valor varia entre 1 e 10000, correspondendo ao valor das bolas. SAÍDA Para cada caso você deve imprimir uma linha com dois inteiros: o valor máximo que um dos jogadores pode ter e o valor mínimo possível para a soma de k bolas do conjunto. EXEMPLO DE ENTRADA 3 42 1243 10 3 3333333333 10 5 1 100 40 25 33 44 40 25 12 97 EXEMPLO DE SAÍDA 7 3 9 9 321 96 12