Você está na página 1de 12

MP 2011 - Sede UFAM Manaus-AM Preparatrio para Maratona de Programao 2011

6 SIMULADO

02 de setembro de 2011

ACM International Collegiate Programming Contest 2011 SBC Brasil Norte AM/RR, Sede UFAM

Problema A
O Problema da Parada
Nome do arquivo fonte: parada.c, parada.cpp, parada.java ou parada.pas
O Problema da Parada (The Halting Problem) um problema de deciso clssico da Cincia da Computao que consiste, basicamente, em determinar se um dado programa sempre vai parar (ou seja, terminar sua execuo) para uma dada entrada arbitrria ou se vai executar infinitivamente. Alan Turing provou, em 1936, que impossvel resolver o problema da parada generalizando para qualquer par programa-entrada. Neste problema, porm, dada a descrio de uma linguagem simples, um programa escrito nessa linguagem e uma entrada para esse programa, voc deve determinar se o programa dado para com a entrada dada e, em caso positivo, qual a sada produzida. Esta linguagem s trabalha com nmeros inteiros de 0 a 999 (inclusive). Sendo assim, o sucessor de 999 0, e o antecessor de 0 999. Alm disso, ela possui dez variveis (R0 a R9), sendo que a R0 sempre atribudo o valor de chamada do programa (ou seja, o parmetro de entrada) e a R9 sempre atribudo o valor de sada (o retorno). No incio da execuo do programa, atribudo o valor 0 a todas as variveis, com exceo de R0 que recebe o parmetro de entrada. As operaes bsicas so atribuio (MOV), soma (ADD), subtrao (SUB), multiplicao (MUL), diviso inteira (DIV) e resto da diviso inteira (MOD). Todas essas operaes tm a sintaxe COMANDO OPERANDO1,OPERANDO2 (sem espaos entre a vrgula e os operandos), onde COMANDO uma dessas operaes, OPERANDO1 uma das 10 variveis (R0 a R9) e OPERANDO2 pode ser uma das 10 variveis ou um valor inteiro (entre 0 e 999). Todas as operaes modificam o valor de OPERANDO1, sendo assim MOV R4,100 o equivalente a atribuir o valor 100 a R4, enquanto que MUL R3,R8 o equivalente a multiplicar R3 por R8 e atribuir o resultado a R3. A operao DIV, assim como a MOD, retornam 0 (zero) se OPERANDO2 for 0 ou se a varivel equivalente tiver valor 0. Ou seja, DIV R4,0 o equivalente a MOV R4,0. Por diviso inteira, entendemos a parte inteira do quociente da diviso (sem a parte fracionria). Por exemplo, a diviso inteira de 7 por 2 3 (sendo o resto 1). Existem seis comandos de fluxo de deciso: IFEQ (se igual), IFNEQ (se diferente), IFG (se maior), IFL (se menor), IFGE (se maior ou igual) e IFLE (se menor ou igual). A sintaxe de todos eles COMANDO OPERANDO1,OPERANDO2 (sem espaos entre a vrgula e os operandos), onde OPERANDO1 e OPERANDO2 podem ser variveis (R0 a R9) ou valores inteiros (entre 0 e 999). Assim, o comando IFEQ R4,123 o equivalente a testar se R4 igual a 123. Caso a condio testada seja verdadeira, o programa continua a executar normalmente a linha subsequente ao comando de deciso. Caso a condio seja falsa, o programa passa a executar a linha subsequente ao ENDIF mais prximo. Todos os comandos de deciso devem ter um comando ENDIF correspondente. Finalmente, existem os comandos CALL e RET, ambos com a sintaxe COMANDO OPERANDO, onde OPERANDO uma varivel (R0..R9) ou valor direto (entre 0 e 999). O comando CALL chama o prprio programa novamente, passando OPERANDO como parmetro de entrada, ou seja, atribuindo o valor de OPERANDO varivel R0. J RET termina a execuo do programa, retornando o valor de OPERANDO como o resultado de sada. A ltima linha do programa sempre ser um comando RET. Observe que, caso o programa chame a si mesmo atravs do comando CALL, quando a execuo voltar, o valor de R9 vai estar alterado com o valor retornado pelo programa. Note tambm que todas as variveis (R0..R9) so locais, ou seja, uma chamada subsequente ao programa no pode alterar os valores guardados nas variveis da instncia anterior, com exceo, naturalmente, do valor de R9 que recebe o retorno da instncia chamada. O exemplo a seguir ilustra um programa que calcula o fatorial de um nmero

ACM International Collegiate Programming Contest 2011 SBC Brasil Norte AM/RR, Sede UFAM

Linha 1 2 3 4 5 6 7 8 9

Comando IFEQ R0,0 RET 1 ENDIF MOV R1,R0 SUB R1,1 CALL R1 MOV R2,R9 MUL R2,R0 RET R2

1 linha: Verifica se o valor de R0 vale 0, caso positivo, executa a prxima linha, caso contrrio, pula para a 4a linha (ENDIF mais prximo). 2 linha: Retorna 1 como sada do programa. 3 linha: Marca o fim do bloco de deciso iniciado na primeira linha. 4 linha: Atribui o valor de R0 a R1 (R1 R0). 5 linha: Diminui 1 de R1 (R1 R1 - 1). 6 linha: Chama o programa passando R1 como parmetro de entrada. 7 linha: Guarda o valor de R9 (retornado pela chamada anterior) em R2 (R2 R9) 8 linha: Multiplica o valor de R2 por R0 (R2 R2 * R0) 9 linha: Retorna o valor de R2 como sada do programa.

A tabela seguir traz um resumo dos comandos para referncia: Comando MOV ADD SUB MUL DIV MOD IFEQ IFNEQ IFG IFL IFGE IFLE ENDIF CALL RET Sintaxe MOV OP1,OP2 ADD OP1,OP2 SUB OP1,OP2 MUL OP1,OP2 DIV OP1,OP2 MOD OP1,OP2 IFEQ OP1,OP2 IFNEQ OP1,OP2 IFG OP1,OP2 IFL OP1,OP2 IFGE OP1,OP2 IFLE OP1,OP2 ENDIF CALL OP RET OP Significado OP1 OP2 OP1 OP1 + OP2 OP1 OP1 - OP2 OP1 OP1 * OP2 OP1 OP1 / OP2 OP1 OP1 % OP2 if OP1 == OP2 if OP1 != OP2 if OP1 > OP2 if OP1 < OP2 if OP1 >= OP2 if OP1 <= OP2 Marca fim do bloco de execuo condicional Chama o programa com OP como entrada return OP

Entrada A entrada contm vrios casos de teste. Cada caso de teste se inicia com dois inteiros, L e N, representando respectivamente o nmero de linhas do programa (1 L < 100) e o valor do parmetro de entrada do programa (0 N < 1000). As L linhas seguintes contm o programa. Podese assumir que ele est sempre sintaticamente correto de acordo com as regras definidas acima. Todos os comandos (bem como o nome das variveis) s contero letras maisculas. O final da entrada marcado pelo caso em que L = N = 0 e no deve ser processado.

ACM International Collegiate Programming Contest 2011 SBC Brasil Norte AM/RR, Sede UFAM

Sada Para cada caso de teste, seu programa deve produzir uma linha contendo um inteiro que representa o valor de sada (retorno) para a entrada N dada, ou um asterisco (*) no caso de o programa nunca terminar. Exemplo de entrada

Exemplo de Entrada

Exemplo de Sada

96 IFEQ R0,0 RET 1 ENDIF MOV R1,R0 SUB R1,1 CALL R1 MOV R2,R9 MUL R2,R0 RET R2 2 123 CALL R0 RET R0 00

720 *

ACM International Collegiate Programming Contest 2011 SBC Brasil Norte AM/RR, Sede UFAM

Problema B
Pases em Guerra
Nome do arquivo fonte: paises.c, paises.cpp, paises.java ou paises.pas
No ano 2050, aps diversas tentativas da ONU de manter a paz no mundo, explode a terceira guerra mundial. Segredos industriais, comerciais e militares obrigaram todos os pases a utilizar servios de espionagem extremamente sofisticados, de forma que em cada cidade do mundo h ao menos um espio de cada pas. Esses espies precisam se comunicar com outros espies, com informantes e mesmo com as suas centrais durante as suas aes. Infelizmente no existe uma forma segura de um espio se comunicar em um perodo de guerra, ento as mensagens so sempre enviadas em cdigo para que somente o destinatrio consiga ler a mensagem e entender o seu significado. Os espies utilizam o nico servio que funciona no perodo de guerra, os correios. Cada cidade possui uma agncia postal onde as cartas so enviadas. As cartas podem ser enviadas diretamente ao seu destino ou a outras agncias postais, at que a carta chegue agncia postal da cidade de destino, se isso for possvel. Uma agncia postal na cidade A pode enviar diretamente uma carta impressa para a agncia postal da cidade B se houver um acordo de envio de cartas, que determina o tempo, em horas, que uma carta leva para chegar da cidade A cidade B (e no necessariamente o contrrio). Se no houver um acordo entre as agncias A e B, a agncia A pode tentar enviar a carta a quantas agncias for necessrio para que a carta chegue ao seu destino, se isso for possvel. Algumas agncias so interligadas por meios eletrnicos de comunicao, como satlites e fibras pticas. Antes da guerra, essas ligaes atingiam todas as agncias, fazendo com que uma carta fosse enviada de forma instantnea, mas durante o perodo de hostilidades cada pas passou a controlar a comunicao eletrnica e uma agncia somente pode enviar uma carta outra agncia por meio eletrnico (ou seja, instantaneamente) se ela estiver no mesmo pas. Duas agncias, A e B, esto no mesmo pas se houver uma forma de uma carta impressa enviada de uma das agncias ser entregue na outra agncia. O servio de espionagem do seu pas conseguiu obter o contedo de todos os acordos de envios de mensagens existentes no mundo e deseja descobrir o tempo mnimo para se enviar uma carta entre diversos pares de cidades. Voc seria capaz de ajud-lo? Entrada A entrada contm vrios casos de teste. A primeira linha de cada caso de teste contm dois inteiros 2 separados por um espao, N (1 N 500) e E (0 E N ), indicando o nmero de cidades (numeradas de 1 a N) e de acordos de envio de mensagens, respectivamente. Seguem-se, ento, E linhas, cada uma com trs inteiros separados por espaos, X, Y e H (1 X, Y N, 1 H 1000), indicando que existe um acordo para enviar uma carta impressa da cidade X cidade Y, e que tal carta ser entregue em H horas. Em seguida, haver uma linha com um inteiro K (0 K 100), o nmero de consultas. Finalmente, viro K linhas, cada uma representando uma consulta e contendo dois inteiros separados por um espao, O e D (1 O,D N). Voc deve determinar o tempo mnimo para se enviar uma carta da cidade O cidade D. O final da entrada indicado por N = 0. Sada Para cada caso de teste da entrada seu programa deve produzir K linhas na sada. A I-sima linha deve conter um inteiro M, o tempo mnimo, em horas, para se enviar uma carta na I-sima consulta.

ACM International Collegiate Programming Contest 2011 SBC Brasil Norte AM/RR, Sede UFAM

Se no houver meio de comunicao entre as cidades da consulta, voc deve imprimir Nao e possivel entregar a carta(sem acentos). Imprima uma linha em branco aps cada caso de teste. Exemplo de entrada

Exemplo de Entrada

Exemplo de Sada

45 125 2 1 10 348 437 236 5 12 13 14 43 41 33 1 2 10 231 321 3 13 31 32 00

0 6 6 0 Nao e possivel entregar a carta 10 Nao e possivel entregar a carta 0

ACM International Collegiate Programming Contest 2011 SBC Brasil Norte AM/RR, Sede UFAM

Problema C
Energia Tempo
Nome do arquivo fonte: energia.c, energia.cpp, energia.java ou energia.pas
Paulo trabalha para uma grande empresa chamada baco Computadores e Manutenes (ACM). O seu trabalho prover manuteno de computadores de clientes da ACM, localizados em diversas partes do pas. Por esta razo, Paulo normalmente passa um bom nmero de horas por semana dentro de avies. Obviamente, Paulo sempre carrega consigo o seu laptop, de forma que mesmo quando est viajando de avio pode executar muitas tarefas relacionadas a seu trabalho. Como as baterias de laptops geralmente no duram muito, Paulo tem estudado alternativas para aumentar o tempo de durao da bateria durante voos. Ele descobriu que processadores modernos podem operar a diversos nveis de frequncia, oferecendo um compromisso entre desempenho e consumo de energia. A ideia inicial de Paulo foi simplesmente configurar o seu laptop na frequncia mais baixa. No entanto, ele notou que isso no era muito til, j que as tarefas executavam muito lentamente no laptop, e no haveria tempo de executar todas as tarefas, de forma que a energia restante na bateria seria intil. Paulo notou, entretanto, que a influncia do nvel frequncia no desempenho varia de aplicao para aplicao, dependendo se elas so limitadas por memria, CPU ou E/S. Adicionalmente, como processadores modernos permitem que o nvel de frequncia seja alterado por software, Paulo planeja utilizar esse mecanismo para aumentar o tempo de uso da bateria de seu laptop, de forma ainda a manter um desempenho razovel. Para levar em considerao tanto a energia como o desempenho, Paulo decidiu usar uma mtrica j bem conhecida, denominada Produto Energia Tempo (mais conhecida pelo acrnimo em ingls, EDP, Energy Delay Product). Paulo tem uma lista de programas que devem ser executados sequencialmente, e todas as informaes sobre o tempo e a energia necessrios para executar cada programa em cada nvel de frequncia, alm da informao de quanta energia gasta para fazer o processador mudar de frequncia. No entanto, para testar sua nova ideia, Paulo ainda tem um problema: como a maioria dos administradores de sistema, ele no gosta de programar. Ele est pedindo a sua ajuda, j que voc um grande amigo e um expert em algoritmos e programao, para determinar o nvel de frequncia em que cada um de seus programas deve ser executado de forma a minimizar o EDP total. Entrada A entrada contm vrios casos de testes. A primeira linha de um caso de teste contm quatro inteiros F, P, E, e A, identificando respectivamente o nmero de nveis de frequncia suportados pelo processador do laptop de Paulo (1 F 20), o nmero de programas a serem executados sequencialmente (1 P 5000), a energia necessria, em Joules, para trocar entre dois quaisquer nveis de frequncia (1 E 100) e o tempo (em ms) para trocar entre quaisquer dois nveis de frequncia (1 A 100). Os nveis de frequncia so identificados por inteiros de 1 a F, e os programas so identificados por inteiros de 1 a P. As P x F linhas seguintes descrevem os programas, com F linhas para cada programa (as primeiras F linhas correspondem ao programa 1, as prximas F linhas correspondem ao programa 2, e assim por diante). A f-sima linha correspondente ao programa p contm dois nmeros Ep,f e Ap,f, representando respectivamente a quantidade de energia (em Joules) e tempo (em ms) para executar o programa p no nvel de frequncia f (1 Ep,f 1000 e 1 Dp,f 1000). No incio de cada caso de teste o processador est no nvel 1 de frequncia. O final da entrada indicada por F = P = E = A = 0.

ACM International Collegiate Programming Contest 2011 SBC Brasil Norte AM/RR, Sede UFAM

Sada Para cada caso de teste da entrada, seu programa deve produzir uma linha na sada, contendo o EDP mnimo para executar sequencialmente o conjunto de programas de 1 a P (ou seja, na ordem em que aparecem na entrada). Exemplo de entrada

Exemplo de Entrada

Exemplo de Sada

2 3 10 10 50 120 100 90 500 600 600 500 400 1000 500 700 3325 7 10 85 15 4 12 4 11 5 12 4 7 10 85 15 4 0000

656100 145

ACM International Collegiate Programming Contest 2011 SBC Brasil Norte AM/RR, Sede UFAM

Problema D
MegaDamas
Nome do arquivo fonte: damas.c, damas.cpp, damas.java ou damas.pas
MegaDamas um jogo de tabuleiro para dois jogadores, muito similar ao conhecido jogo de Damas. O tabuleiro retangular, com N linhas e M colunas de pequenos quadrados arranjados em uma grade N M. Os pequenos quadrados so alternadamente coloridos com uma cor clara e uma cor escura, no padro usual de um tabuleiro de damas. Os quadrados de cor escura so denominados casas (note, no entanto, que por razes de visualizao, os diagramas abaixo mostram casas como quadrados brancos). No incio do jogo, cada jogador tem um certo nmero de peas, posicionadas nas casas mais prximas da borda do tabuleiro que o jogador escolher (os jogadores escolhem bordas opostas). Durante o jogo, as peas s podem ocupar as casas do tabuleiro. Um dos movimentos do jogo capturar uma pea do oponente, saltando sobre ela, diagonalmente, para a casa adjacente alm da pea, casa esta que deve estar vazia. A pea do oponente ento removida do tabuleiro. As trs casas envolvidas na captura (a casa inicial de sua pea, a casa que contm a pea do oponente e a casa vazia, onde sua pea estar aps a jogada) devem estar diagonalmente alinhadas e devem ser diagonalmente adjacentes, como no diagrama abaixo.

Em MegaDamas uma pea pode capturar peas do oponente saltando diagonalmente para a frente ou para trs (note que, na maioria das variaes existentes do jogos de Damas, uma pea s pode capturar peas oponentes saltando para a frente). Voc pode tambm efetuar uma captura mltipla, com uma pea apenas, saltando seguidamente para casas vazias sobre peas oponentes. Em uma captura mltipla, a sua pea pode mudar de direo, saltando primeiro em uma direo e depois em outra. Voc pode capturar apenas uma pea a cada salto, mas pode capturar vrias peas com saltos seguidos. Voc no pode saltar sobre uma pea sua, e no pode saltar a mesma pea oponente mais de uma vez. So dadas as dimenses do tabuleiro e uma descrio do estado corrente de um jogo. a sua vez de jogar e voc deve determinar o nmero mximo de peas do seu oponente que podem ser capturadas em um movimento de captura.

ACM International Collegiate Programming Contest 2011 SBC Brasil Norte AM/RR, Sede UFAM

10

Entrada A entrada contm vrios casos de teste. A primeira linha de um caso de teste contm dois inteiros N e M indicando respectivamente o nmero de linhas e o nmero de colunas do tabuleiro (3 N 20, 3 M 20 e N x M 200). O quadrado mais esquerda do tabuleiro na borda mais prxima ao jogador uma casa. A segunda linha contm a descrio do estado do jogo. Cada descrio consiste de [(N x M) / 2] inteiros, separados por um espao, correspondendo s casas do tabuleiro, que so numeradas de 1 a [(N x M) / 2], da esquerda para a direita, da borda mais prxima ao jogador borda mais prxima ao seu oponente. Na descrio do estado do jogo, 0 representa uma casa vazia, 1 representa uma casa com uma de suas peas, e 2 representa uma casa com uma pea de seu oponente. H no mximo [(N x M) / 4] peas de cada jogador no tabuleiro. O final da entrada indicado por N = M = 0.

Figura 1: Numerao das casas em (a) tabuleiro de dimenses 8 8 e em (b) tabuleiro de dimenses 5 x 3. Sada Para cada caso de teste da entrada, seu programa deve produzir uma nica linha na sada, contendo um inteiro indicando o maior nmero de peas de seu oponente que podem ser capturadas em uma jogada. Exemplo de entrada

Exemplo de Entrada

Exemplo de Sada

33 21201 53 10210200 88 222200002222000022220 00022220100 00

1 2 7

ACM International Collegiate Programming Contest 2011 SBC Brasil Norte AM/RR, Sede UFAM

11

Problema E
Rota Crtica
Nome do arquivo fonte: rota.c, rota.cpp, rota.java ou rota.pas
Uma tragdia aconteceu recentemente em sua cidade. Um paciente em condio crtica, que necessitava tratamento urgente, morreu enquanto era transportado para um grande hospital da capital do estado. O que ocorreu foi que a ambulncia ficou presa no trnsito, devido a uma rocha que deslizou na estrada. A populao reclamou com o governador, que agora deseja evitar acontecimentos similares no futuro. Infelizmente, deslizamentos de rochas so muito comuns nesse estado, com muitas montanhas e serras. Assim, para minimizar o nmero de tragdias devidas a deslizamentos de rochas e outros imprevistos, o governador decidiu criar rotas alternativas entre cada cidade do estado e a capital. Para isso, necessrio inicialmente identificar quais segmentos de estradas so atualmente crticos, isto , se bloqueados causam que no haja caminho possvel entre alguma cidade e a capital. Um segmento de estrada um trecho de estrada que liga duas cidades distintas. Sua tarefa escrever um programa para identificar esses segmentos crticos de estradas. Entrada A entrada composta de vrios casos de testes. A primeira linha de um caso de teste contm dois inteiros N e M que indicam respectivamente o nmero de cidades (2 N 100) e o nmero de segmentos de estrada (1 M 10000). Cada uma das N linhas seguintes contm o nome de uma cidade (apenas letras minsculas e maisculas, comprimento mximo de 20 caracteres). A primeira dessas cidades a capital do estado. Cada uma das M linhas seguintes descreve um segmento de estrada, contendo um par de nomes de cidades separados por um espao em branco. Note que, como as montanhas causam dificuldade na construo de estradas, muitos segmentos de estrada so de mo nica. Um segmento com duas mos representado por dois trechos de mo nica. Voc deve supor que existe ao menos um caminho de cada cidade para a capital. O final da entrada indicado por N = M = 0. Sada Para cada caso de teste seu programa deve listar os segmentos crticos, com um segmento crtico por linha. Cada segmento crtico deve ser representado por dois nomes de cidades separados por um espao em branco. Os segmentos crticos de estrada devem ser listados na mesma ordem em que aparecem na entrada; para cada segmento, as cidades devem ser listadas na mesma ordem em que aparecem na entrada. Se no existir nenhum segmento crtico seu programa deve imprimir uma linha contendo apenas a palavra Nenhuma. Imprima uma linha em branco aps cada caso de teste. Exemplo de entrada

Exemplo de Entrada

Exemplo de Sada

6 10 PortoAlegre Gramado Canela NovoHamburgo Pelotas RioGrande Canela Gramado

1 2 7 Gramado NovoHamburgo NovoHamburgo PortoAlegre RioGrande Pelotas Pelotas PortoAlegre

ACM International Collegiate Programming Contest 2011 SBC Brasil Norte AM/RR, Sede UFAM

12

Canela NovoHamburgo Gramado NovoHamburgo NovoHamburgo PortoAlegre PortoAlegre NovoHamburgo RioGrande Pelotas Pelotas PortoAlegre PortoAlegre Pelotas Pelotas RioGrande NovoHamburgo Canela 35 Sacramento SanFrancisco SantaClara SanFrancisco Sacramento Sacramento SantaClara SantaClara SanFrancisco SanFrancisco Sacramento Sacramento SanFrancisco 34 Recife Olinda Paulista Olinda Recife Paulista Recife Olinda Paulista Paulista Olinda 00

SantaClara SanFrancisco Nenhuma

Você também pode gostar