Você está na página 1de 11

OPI 2012 Modalidade Avanada

17 de Novembro de 2012

(Este caderno contm 10 problemas)

A PROVA TER DURAO DE CINCO HORAS

LEIA ATENTAMENTE AS INSTRUES ABAIXO ANTES DE INICIAR A PROVA

A prova deve ser realizada em equipe de 3 pessoas; Observem o nome do arquivo que deve ser enviado para cada problema; Cada questo tem um tempo limite. Por isso otimizem seu cdigo; permitido consultar material impresso durante a prova; No permitida a consulta de qualquer material online; Este caderno de tarefas composto de 10 pginas (no contando esta folha de rosto). Verifique se o caderno est completo.

Olimpada Paraibana de Informtica 2012 ___________________________________________________________________________________ Problema A. Grau de Afinidade Nome do Programa: grau.(c|cpp|java|py) Tempo: 3 segundos Aps anos de pesquisa, Alan descobriu uma frmula que indica se duas pessoas possuem afinidade. Ele desenvolveu um questionrio, que deve ser respondido separadamente pelo casal, e a partir da sua frmula mgica, ele identifica o grau de afinidade do casal. O grau de afinidade de um casal calculado atravs das respostas de um questionrio que um casal dever responder. As respostas so sempre nmeros inteiros entre 0 e 100. Primeiramente, ele analisa as respostas de um casal para uma determinada questo separadamente, identificando o quadrado da diferena das respostas para a questo. Ele denominou isso de simetria da resposta. O grau de afinidade dado pela soma de todas as simetrias das questes, exceto a simetria de maior valor. Quanto menor o valor, maior a afinidade do casal. Alan te contratou para criar um algoritmo que calcula o grau de afinidade a partir de um conjunto de respostas. Este algoritmo ser usado como parte de um aplicativo para o iPhone que ele vem desenvolvendo. Entrada A entrada comea com um inteiro, indicando o nmero total de entrevistas. Cada entrevista comea com um inteiro N (0 N 100), indicando o nmero de perguntas do questionrio. Em seguida, apresentam-se duas linhas. Cada linha apresenta um conjunto de N nmeros inteiros. A primeira linha representa as respostas da mulher, e a segunda linha define as respostas do homem, tal qual o formato a seguir: r1 r2 r3 ... rn, onde 0 ri 100 Sada A sada deve indicar o grau de afinidade do casal, no formato indicado pelos casos de teste. Casos de Teste Entrada 3 10 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1 7 50 50 50 50 50 50 50 100 2 3 4 5 0 50 5 10 10 10 10 10 10 10 10 0 15 Sada Caso 1: 249 Caso 2: 11154 Caso 3: 25

Olimpada Paraibana de Informtica 2012 ___________________________________________________________________________________ Problema B. Temos um vencedor! Ou ser que no? Nome do Programa: vencedor.(c|cpp|java|py) Tempo: 3 segundos Durante as competies da Olimpada Paraibana de Informtica muito comum que os tcnicos, como Jemerson Damsio, fiquem ansiosos at o ltimo momento, quando o relgio para e possvel verificar o campeo. O problema que devido s penalidades, quando h casos de empate em nmero de questes, h incerteza sobre quem ser o vencedor. Por isso, durante a prova ele faz inmeras anlises para saber quem vai ser o campeo. Nesse instante ele est fazendo clculos. O placar calculado da seguinte forma: os times so classificados pelo nmero de questes resolvidas, em caso de empate, o critrio de tempo utilizado. A classificao por tempo dada da seguinte forma: cada submisso correta penaliza em pontos baseado em quantos minutos passaramse desde que a competio comeou. Cada submisso incorreta adiciona uma penalizao de p minutos ao score (normalmente p=20), desde que aquela questo tenha sido resolvida. Resumindo, para cada questo RESOLVIDA a penalizao do time para aquela questo calculada assim: Penalizao = [X + (Y-1)*p], onde X representa o tempo em minutos que o time levou para resolver a questo desde o incio da prova, e Y representa o nmero de tentativas. Note que se o time acertou a questo na primeira tentativa, ele no ser penalizado por tentativas incorretas. O seu papel ajudar Jemerson escrevendo um programa que analisa o placar para dois times e responde se, dado o placar no momento atual da competio, o outro time ainda possui chances de vencer. Um time resolveu todos os problemas da competio, e o outro continua competindo. Entrada A entrada comea com um inteiro N, o nmero total de casos de teste. Cada instncia comea com um inteiro K no negativo 0 K 100, o nmero de questes. A linha seguinte apresenta o valor de p (0 p 100), para os pontos de penalidade. Ento haver dois conjuntos de 2K inteiros, um por linha: a1 t1 a k tk ai o nmero de tentativas que o time gastou com a questo i at o momento. ti o tempo de relgio (em minutos) que o time precisou para acert-la. Se ai ou ti forem iguais a zero, ento a questo ainda no foi resolvida. Todos os valores a i e ti so valores entre 0 e 1000. O primeiro conjunto de 2*K inteiros refere-se ao time que acertou todas as questes. O segundo conjunto referese ao time que ainda est trabalhando nos problemas. O final de uma instncia consiste de um inteiro positivo M, que representa o tempo total de minutos passados na competio. M tem valor mnimo igual ltima submisso correta. Sada Para cada instncia, seu programa deve imprimir uma nica linha, contendo um nico caractere: S, se o segundo time pode empatar ou fazer melhor que o primeiro time, ou N caso contrrio. Casos de Teste Entrada 2 6 20 5 120 1 0 1 201 6 5 5 120 0 0 1 201 Caso 1: S Caso 2: N 1 60 2 120 2 200 1 90 2 108 20 3 100 1 147 2 36 1 150 Sada

1 60 2 120 2 200 1 90 2 108 20 3 200 1 147 2 36 1 150

Olimpada Paraibana de Informtica 2012 ___________________________________________________________________________________ Problema C. UFC Nome do Programa: ufc.(c|cpp|java|py) Tempo: 3 segundos Rmy fantico por jogos de vdeo game. O seu jogo predileto o famoso jogo de lutas UFC. Neste jogo, o usurio luta contra um oponente. O usurio pode aplicar 26 tipos de golpes diferentes no adversrio. Por exemplo, aplicando o golpe Munganga, o usurio d um chute na cabea do adversrio. Outro exemplo de golpe a Sapatada de Pau, aonde o usurio tira o seu sapato e joga na cabea do oponente. Ele ganhou todas as lutas at hoje por nocaute, mas ele gosta mesmo quando ganha a luta aplicando o nocaute perfeito. Este nocaute ocorre quando o adversrio recebe o golpe Munganga, e em seguida o golpe Sapatada de Pau. Este par vitorioso desde que sejam utilizadas no mximo com dois outros golpes entre eles. Rmy to fantico que gravou todas as suas lutas de UFC que participou. Ele te contratou para analisar as lutas feitas e determinar quantos nocautes perfeito ele aplicou nos adversrios, at hoje. Entrada A entrada comea com um inteiro N representando o nmero de partidas feitas por Rmy. Em seguida, so dadas N linhas, cada uma contendo uma sequncia de letras, representando os golpes aplicados por Rmy nos adversrios. O tamanho da sequncia de golpes dado por t, aonde 0 < t 100. Os golpes so representados por letras maisculas. Por exemplo, M representa o golpe Munganga. J S representa o golpe Sapatada de Pau. Existem outros 24 golpes, cada uma representado por uma letra diferente. Sada A sada deve consistir de um nico nmero inteiro indicando quantas partidas Rmy ganhou por nocaute perfeito. Casos de Teste Entrada 5 MMOOS DOMSCD MOS SMABCKDJFLAPQI OM Sada 3

Olimpada Paraibana de Informtica 2012 ___________________________________________________________________________________ Problema D. Regex Para Novatos Nome do Programa: regex.(c|cpp|java|py) Tempo: 3 segundos Como qualquer aluno do primeiro perodo, Phyllipe acreditava que seria bastante fcil resolver todos os problemas da computao. O seu hobby era implementar todos os comandos do Linux. No incio, as coisas pareciam fceis, at quando ele tentou implementar o comando grep. Este ele no conseguiu. O comando grep permite que possamos procurar por certos padres em nomes de arquivos utilizando o metacaractere asterisco (*), que simboliza zero ou mais caracteres quaisquer. O seu papel ajud-lo nessa atividade escrevendo um programa que ajude a identificar quais palavras satisfazem a uma determinada expresso regular. Por exemplo, a expresso regular *.* indica que as palavras devem possuir pelo menos um caractere ponto para satisfazer a esta expresso regular. As palavras main.c e regex.java satisfazem a esta expresso regular. Entretanto, as palavras facisa e uepb no satisfazem a expresso regular, j que no possuem o caractere ponto. Entrada A entrada comea com um inteiro, representando o nmero total de casos de teste. A primeira linha de cada caso de teste contm uma string P, que possui 1-100 caracteres entre a-z, * e ., simbolizando a expresso regular. A segunda linha contm um inteiro K indicando o nmero de strings que devem ser analisadas. As prximas K linhas indicam uma nica string, cada, com no mximo 100 caracteres entre a-z e .. Restries 1 K 100 Sada A sada deve exibir as strings que satisfazem a expresso regular, uma por linha, na mesma ordem que aparecem na entrada. Uma linha em branco deve ser impressa apenas entre os casos de teste. Casos de Teste Entrada 2 *.* 4 main.c a.out readme yacc *a*a*a 4 aaa aaaaa aaaaax abababa Sada main.c a.out aaa aaaaa abababa

Olimpada Paraibana de Informtica 2012 ___________________________________________________________________________________ Problema E. Sorteio com Futuro Nome do Programa: sorteio.(c|cpp|java|py) Tempo: 3 segundos Uma empresa lanou um programa de compra de veculos interessante: indivduos podem dar um nico lance de qualquer valor para comprar uma Ferrari. Se o lance for o maior naquele ano, pode-se comprar a Ferrari pelo valor pago no lance. Quando Rgel comprou uma Ferrari com um lance de R$10,00 voc ficou bastante animado com a possibilidade, e acabou comprando um lance. Voc sabe que se no for sorteado este ano, seu lance ficar registrado para os anos seguintes. No entanto, no prximo ano, para manter o tamanho do grupo constante, h abertura para um novo lance, e o seu poder ficar sempre para trs. A sua tarefa fazer um programa que, dada parte da lista de lances, informe, caso seja possvel, qual o ano que voc ir tirar a sua Ferrari. Entrada A entrada comea com um inteiro, representando o nmero total de casos de teste. A primeira linha de cada caso contm dois inteiros, K e N, denotando o tamanho do conjunto inicial de lances (ano 2012), e o nmero de anos para os quais voc tem informao, respectivamente. A seguir, cada linha consiste de dois inteiros, o ano do lance e o valor V dado. A primeira linha o seu lance, as demais K+N-2 linhas so dos demais apostadores. O ano de 2012 o ano de formao do grupo original, com tamanho K, ento perceba que haver exatamente K valores associados ao ano de 2012. Os demais anos possuem um lance cada. Restries 1 K,N 10 31 1 V 2 -1 Sada Seu programa deve imprimir o ano em que voc poder comprar com o seu lance, ou desconhecido, caso no seja possvel determinar. Casos de Teste Entrada 2 2 4 2014 2012 2012 2015 2013 2 4 2012 2014 2013 2012 2015 2 1 3 4 6 1 2 4 5 3 Sada Caso 1: 2014 Caso 2: desconhecido
5

Olimpada Paraibana de Informtica 2012 ___________________________________________________________________________________ Problema F. Projetos da Disciplina Nome do Programa: disciplina.(c|cpp|java|py) Tempo: 3 segundos Ayla uma professora extremamente dedicada. Com o objetivo de que os alunos realmente aprendam o contedo da disciplina, ela sempre realiza projetos em todas as disciplinas. s vezes os projetos so realizados em grupo, outras vezes individualmente. Ela utiliza seus conhecimentos matemticos para definir quem vai estar no grupo de quem. Para isso, ela utilizou os seus conhecimentos de funes hash. Funes hash so conhecidas como funes de disperso (ou espalhamento). O objetivo da funo receber um valor como entrada e gerar outro. No caso de Ayla, a entrada representada pelo nmero da matrcula do aluno. Idealmente, uma funo hash evita (ou minimiza) repeties de valores gerados para diferentes valores de entrada. O importante para Ayla que no se tenha grupos muito grandes. Se duas matrculas de aluno recebidas como entrada retornam o mesmo valor da funo hash, Ayla indica que estes alunos devem realizar o trabalho em conjunto. Assuma que os alunos possuem matrculas distintas. A funo hash utilizada por Ayla tem o seguinte formato: f(X) = X mod Y, onde mod o resto da diviso de X (matrcula) por Y (divisor). Voc foi contratado por Ayla para desenvolver um software que dado um conjunto de matrculas, indique quantos alunos iro realizar em grupo para um determinado projeto. Entrada A primeira linha da entrada consiste de um valor N, representando o nmero de casos de teste. Cada caso de teste inicia com dois valores em uma s linha, Y e M. Considera-se o Y o divisor da funo de disperso, e o M a quantidade de matrculas a serem testadas pela funo. A seguir, so apresentadas M linhas, cada uma contendo um inteiro X representando a matrcula de cada aluno. Em um mesmo caso de teste no h repeties do valor de X. Restries 1 N 30 1 Y, M 3000 Sada Para cada caso de teste seu programa deve imprimir o nmero de alunos que realizaro trabalho em grupo (ou seja, no realizaro trabalho individualmente). Casos de Teste Entrada 2 7 4 7 14 22 1 21 5 441 21 42 12 34 Sada Caso 1: 4 Caso 2: 3

Olimpada Paraibana de Informtica 2012 ___________________________________________________________________________________ Problema G. Sum de Dedos Nome do Programa: sumo.(c|cpp|java|py) Tempo: 3 segundos Sum de Dedos um jogo bastante conhecido em Rio Tinto, no qual dois indivduos enfrentam-se utilizando o seu polegar para prender o polegar do oponente.

Um tpico cenrio de batalha do sum de dedos. Mateus um verdadeiro viciado em estatstica. Por 20 anos a fio ele estudou partidas de Sum de Dedos. Ele realizou diversos tipos de pesquisa. Na mais recente, ele utilizou centenas de voluntrios para medir suas velocidades de movimento do polegar em um evento em Rio Tinto. Ele concluiu que um jogador que possui velocidade superior em pelo menos 20% ao seu oponente sempre vence! Um achado notvel, que dever ser reconhecido pelo governador da Paraba. O seu objetivo determinar quem ser o vencedor de um embate dadas as velocidades dos polegares de dois oponentes. Entrada A entrada comea com um inteiro N, representando o nmero total de casos de teste. Cada caso de teste consiste de uma nica linha contendo dois inteiros X e Y, que representam as velocidades dos polegares dos dois oponentes. Restries 1 N 30 1 X,Y 30000 Sada Seu programa deve imprimir uma linha para cada caso de testes, informando quem ser o vencedor, se o oponente nmero 1 ou o oponente nmero 2. Caso no seja possvel determinar quem ser o vencedor, a mensagem indeterminado deve ser impressa, conforme formato que segue. Casos de Teste Entrada 3 4 5 30 35 24 20 Sada Caso 1: oponente 2 Caso 2: indeterminado Caso 3: oponente 1

Olimpada Paraibana de Informtica 2012 ___________________________________________________________________________________ Problema H. So Joo em Patos Nome do Programa: brincantes.(c|cpp|java|py) Tempo: 3 segundos Um grupo de moradores da cidade de Patos est pensando em um novo evento para o prximo So Joo, a loucadrilha. Na loucadrilha, todo mundo dana como quiser e com qualquer par que desejar. O importante se divertir. O evento to importante que o governador da Paraba criou um concurso, aonde alguns jurados indicam suas preferncias. Cada jurado responsvel por gerar uma lista com os pares (casal) organizados com a sua sequncia preferida, do casal mais divertido ao menos divertido. Definiu-se o vencedor da seguinte forma: Um casal X ganha de outro casal Y, se a maior parte dos jurados tiver preferncia pelo casal X do que pelo casal Y na votao. Um casal X ganha o concurso se ganhar de todos os outros casais. Por exemplo, assuma que h 3 casais candidatos (A, B e C) e trs jurados, cujas listas de preferncias so ABC, BAC, CBA. Neste exemplo, o casal B o vencedor, ganhando do casal A nas listas dos jurados 2 e 3 (aparece mais esquerda), e ganhando do casal C nas listas dos jurados 1 e 2. O problema que parece que neste sistema de votao pode no haver um vencedor. A fim de descobrir se isto verdade, o governador da Paraba te solicitou que desenvolvesse um programa para definir o ganhador da loucadrilha. Entrada A entrada comea com um inteiro N, representando o nmero total de casos de teste. Cada caso de teste comea em uma nica linha contendo dois inteiros positivos J e P, onde J indica o nmero de jurados e P indica o nmero de pares concorrendo. Candidatos so numerados de 0 a P-1. Seguindo a primeira linha h J linhas, contendo P valores cada. Cada linha representa uma lista de preferncia, e contm apenas valores de 0 a P-1 em alguma ordem. Restries 1 J 500; 1 P 2500 Sada Para cada caso de teste imprima uma nica linha contendo o nmero do casal vencedor, ou a frase sem vencedor caso no seja possvel determina-lo. Utilize o formato que segue. Casos de Teste Entrada 2 3 0 1 2 3 0 1 2 3 1 0 1 3 1 2 0 2 2 0 2 0 1 Sada Caso 1: 1 Caso 2: sem vencedor

Olimpada Paraibana de Informtica 2012 ___________________________________________________________________________________ Problema I. Construtora de Prdios Nome do Programa: construtora.(c|cpp|java|py) Tempo: 5 segundos Manoel um renomado construtor paraibano. Ele construiu inmeros prdios na Paraba. Algumas pessoas falam que muito do seu sucesso se deve sua superstio. Por exemplo, ele s autoriza construir um novo pavimento (andar) de um prdio de acordo com as sugestes da sua numerloga. Suponha que cada construo demora um nmero N de dias para ser construda. Os operrios s podem erguer um novo andar do prdio em certos dias D. Esses dias, quando representados em nmero binrio, possuem um nmero de dgitos 1s que seja mltiplo de 3. Isso, segundo o Zodaco, indica que trar muita riqueza e prosperidade para Manoel. Por exemplo, Manoel s autoriza a construo de um novo andar no 7 dia da obra (em binrio o representado por 111). O prximo dia que pode erguer 11 dia (em binrio representado por 1011), o o o e depois no 13 , 14 , 19 dias e assim por diante. Assuma que no dia 0, o prdio no possui andar. Ele te contratou para desenvolver um software que a partir de um nmero de dias N da obra, voc determine a quantidade de andares que o prdio deveria ter. Com isso ele vai poder comparar com o estgio da obra atual, e ver se os seus operrios esto atrasados ou no. Entrada A entrada comea com um inteiro N, representando o nmero total de casos de teste. A entrada para 16 cada caso de teste vai consistir de uma linha contendo um nmero inteiro positivo N (N < 10 ), representando o nmero de dias desde que a obra inicializou. Sada Para cada caso de teste, imprima o nmero de andares que o prdio deveria possuir. Utilize o formato que segue. Casos de Teste Entrada
3 2 19 64
o

Sada
Dia 2: Andar = 0 Dia 19: Andar = 5 Dia 64: Andar = 21

10

Olimpada Paraibana de Informtica 2012 ___________________________________________________________________________________ Problema J. Praias do Litoral Paraibano Nome do Programa: praias.(c|cpp|java|py) Tempo: 3 segundos As belssimas praias de Joo Pessoa so lugares lindos para uma boa caminhada. O litoral paraibano , sem dvida, um dos mais belos do Brasil, e qualquer um gostaria de conhec-lo em toda sua extenso. Porm, facilmente se percebe que caminhar entre praias na Paraba no algo muito fcil, pois quase nenhuma praia definida em uma linha reta, o que torna os trajetos bem mais longos. Visando facilitar a vida de inmeros turistas e moradores que gostariam de transitar entre as praias com maior facilidade, Rafael pensou em submeter um projeto para o governo da Paraba, visando a implantao de pontes em linha reta que atravessem e interliguem as praias. A fim de minimizar os gastos do governo, devero ser utilizadas unidades de ponte de 1 metro cada, que podero ser combinadas at um oramento mximo previsto. Ainda sobre a restrio oramentria, fez-se necessrio determinar os locais timos para a instalao das pontes, de forma a economizar o mximo de caminhada. Por exemplo, se pela areia uma praia se prolonga por 30 km, e pela ponte a distncia de 10 km, ento a economia de 20km. Para simplificar a verso inicial do projeto, Rafael definiu que cada praia descrita como dois segmentos de reta. Por razes de segurana, uma ponte atravessa no mximo uma praia. Entrada A entrada comea com um inteiro, representando o nmero total de casos de teste. A entrada para cada caso de testes consiste de duas linhas. A primeira linha contm dois inteiros positivos n e m indicando o nmero de praias e o tamanho mximo da ponte que poder ser construda. A linha seguinte contm 2n+1 pares de inteiros de coordenadas para as praias, onde a ltima coordenada para a praia i serve como a primeira para a praia i+1. Para fins de exemplo, considere as coordenadas de duas praias consecutivas, e a sua representao no plano cartesiano. Todas as coordenadas so dadas em unidades de metros e estaro entre -300000 e 300000. Os valores mximos para n e m so 50 e 3000, respectivamente. vlido assumir que duas retas que configuram uma praia nunca formaro ngulos maiores que 180 graus. Sada Para cada caso de teste imprima uma nica linha contendo o nmero do caso, seguido do comprimento da ponte usada e a economia total obtida com a localizao tima das pontes. Todos os valores devem ser em metros e arredondados para duas casas decimais, sempre observando a centena mais prxima. Utilize o formato que segue. Casos de Teste Entrada 3 2 0 2 0 2 0 6 0 4 2 0 4 2 6 0 8 6 0 4 2 0 4 8 6 0 8 10 0 4 2 0 4 8 6 0 8 Sada Caso 1: 6 metros usados economizando 5.77 metros Caso 2: 6 metros usados economizando 14.96 metros Caso 3: 8 metros usados economizando 17.44 metros

11

Você também pode gostar