acm

International Collegiate Programming Contest

2006

event sponsor

Maratona de Programa¸˜o da SBC 2006 ca
Sub-Regional Brasil do ACM ICPC
9 de Setembro de 2006

(Este caderno cont´m 8 problemas; as p´ginas est˜o numeradas de 1 a 16, n˜o contando esta e a a a p´gina de rosto) a

Sedes Regionais
Regi˜o Centro-Oeste a • Universidade de Bras´ ılia, Bras´ ılia, DF • UNAES, Campo Grande, MS • Universidade Estadual do Mato Grosso do Sul, Dourados, MS Regi˜o Nordeste a • Unifor, Fortaleza, CE • Universidade Federal do Rio Grande do Norte, Natal, RN • AESO, Olinda, PE • Unime, Salvador, BA • Universidade Federal do Maranh˜o, S˜o Lu´ MA a a ıs, Regi˜o Sul a • Unioeste, Cascavel, PR • URI, Erechim, RS • Unisul, Florian´polis, SC o • Universidade Federal do Rio Grande do Sul, Porto Alegre, RG • FURG, Rio Grande, RS Regi˜o Sudeste a • Universidade Federal de Minas Gerais, Belo Horizonte, MG • Metrocamp, Campinas, SP • Faculdades M´dulo, Caraguatatuba, SP o • Universo, Juiz de Fora, MG • PUC Po¸os de Caldas, Po¸os de Caldas, MG c c • Universidade Federal do Rio de Janeiro, Rio de Janeiro, RJ • Uninove, S˜o Paulo, SP a • Unitau, Taubat´, SP e • Unitri, Ubertlˆndia, MG a • Centro Universit´rio de Vila Velha, Vila Velha, ES a Regi˜o Norte a • Centro Universit´rio do Par´, Bel´m, PA a a e • Faculdade SEAMA, Macap´, AP a • Universidade Federal de Tocantins, Palmas, TO

Promo¸˜o: Sociedade Brasileira de Computa¸˜o ca ca Patroc´ ınio: Funda¸˜o Carlos Chagas – IBM – Ci&T – Microsoft – UOL ca

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

1

Problema A
Circuito Bioqu´ ımico Digital
Nome do arquivo fonte: circuito.c, circuito.cpp, circuito.java ou circuito.pas Um circuito bioqu´ ımico digital (CBD) ´ um artefato composto de um conjunto de pontos de e processamento. Cada ponto de processamento ´ constitu´ por um min´sculo recept´culo para e ıdo u a reagentes bioqu´ ımicos, feito de um substrato biol´gico que se comporta como um micro-circuito o eletrˆnico digital. Dependendo do estado da rea¸˜o no recept´culo, o substrato gera dois n´ o ca a ıveis de voltagem. Um leitor acoplado ao CBD ´ capaz de realizar a leitura de todos os pontos de e processamento de um CDB num dado instante, interpretando os dois n´ ıveis de voltagem como 0 ou 1. Um experimento com o CBD ´ realizado da seguinte maneira. Os pontos de processamento e s˜o carregados com as substˆncias de interesse e reagentes apropriados e, a cada intervalo fixo a a de tempo (tipicamente alguns milisegundos), os pontos de processamento s˜o lidos. Assim, o exa perimento resulta em uma seq¨ˆncia de conjuntos (vetores) de bits, cada vetor correspondendo ue a uma medi¸˜o do CBD. ca Uma seq¨ˆncia ininterrupta de bits 1 de um mesmo ponto de processamento ao longo do ue tempo ´ denominada de palito. O comprimento de um palito ´ o n´mero de bits 1 que o comp˜e e e u o (note que o comprimento dos palitos de um experimento pode variar entre um e o n´mero u de medi¸˜es efetuadas). Uma caracter´ co ıstica importante de um experimento com o CBD ´ a e quantidade e o comprimento dos palitos gerados. A figura abaixo mostra o resultado de um experimento realizado com um CBD de seis pontos de processamento, em que foram efetuadas quatro medi¸˜es, contendo trˆs palitos de comprimento um, um palito de comprimento dois e co e um palito de comprimento quatro. 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0

Vocˆ foi contratado para escrever um programa que determine, dado o resultado de um e experimento, quantos palitos de comprimento igual ou maior do que um certo valor foram gerados.

Entrada
A entrada cont´m v´rios casos de teste. A primeira linha de um caso de teste cont´m trˆs inteiros e a e e P, N e C que indicam respectivamente o n´mero de pontos de processamento (1 ≤ P ≤ 1000), o u n´mero de medi¸oes efetuadas (1 ≤ N ≤ 1000) e o comprimento m´ u c˜ ınimo de palitos de interesse (1 ≤ C ≤ N ). Cada uma das pr´ximas N linhas cont´m seq¨ˆncias de P d´ o e ue ıgitos {0, 1}, separados por um espa¸o em branco. O final da entrada ´ indicado por P = N = C = 0. c e A entrada deve ser lida da entrada padr˜o. a

Sa´ ıda
Para cada caso de teste da entrada seu programa deve produzir uma unica linha da sa´ ´ ıda, contendo o n´mero de palitos de comprimento maior ou igual a C produzidos pelo experimento. u

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

2

A sa´da deve ser escrita na sa´da padr˜o. ı ı a Exemplo de entrada 2 1 1 4 0 1 1 1 1 0 2 1 1 5 1 1 0 0 1 0 2 Sa´ para o exemplo de entrada ıda 2 2

3 0 1 0 1 0 0

1 1 1 1 0

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

3

Problema B
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 decis˜o cl´ssico da Ciˆncia e a a e da Computa¸ao que consiste, basicamente, em determinar se um dado programa sempre vai c˜ parar (ou seja, terminar sua execu¸ao) para uma dada entrada arbitr´ria ou se vai executar c˜ a infinitivamente. Alan Turing provou, em 1936, que ´ imposs´ resolver o problema da parada e ıvel generalizando para qualquer par programa-entrada. Neste problema, por´m, dada a descri¸˜o e ca de uma linguagem simples, um programa escrito nessa linguagem e uma entrada para esse programa, vocˆ deve determinar se o programa dado p´ra com a entrada dada e, em caso e a positivo, qual a sa´ produzida. ıda Esta linguagem s´ trabalha com n´meros inteiros de 0 a 999 (inclusive). Sendo assim, o o u sucessor de 999 ´ 0, e o antecessor de 0 ´ 999. Al´m disso, ela possui dez vari´veis (R0 a R9), e e e a sendo que a R0 sempre ´ atribu´ o valor de chamada do programa (ou seja, o parˆmetro e ıdo a de entrada) e a R9 ´ sempre atribu´ o valor de sa´ (o retorno). No in´ da execu¸ao do e ıdo ıda ıcio c˜ programa, ´ atribu´ o valor 0 a todas as vari´veis, com exce¸˜o de R0 que recebe o parˆmetro e ıdo a ca a de entrada. As opera¸˜es b´sicas s˜o atribui¸˜o (MOV), soma (ADD), subtra¸ao (SUB), multiplica¸ao (MUL), co a a ca c˜ c˜ divis˜o inteira (DIV) e resto da divis˜o inteira (MOD). Todas essas opera¸oes tˆm a sintaxe a a c˜ e COMANDO OPERANDO1,OPERANDO2 (sem espa¸os entre a v´ c ırgula e os operandos), onde COMANDO ´ e uma dessas opera¸˜es, OPERANDO1 ´ uma das 10 vari´veis (R0 a R9) e OPERANDO2 pode ser uma co e a das 10 vari´veis ou um valor inteiro (entre 0 e 999). Todas as opera¸˜es modificam o valor a co de OPERANDO1, sendo assim MOV R4,100 ´ o equivalente a atribuir o valor 100 a R4, enquanto e que MUL R3,R8 ´ o equivalente a multiplicar R3 por R8 e atribuir o resultado a R3. A opera¸˜o e ca DIV, assim como a MOD, retornam 0 (zero) se OPERANDO2 for 0 ou se a vari´vel equivalente tiver a valor 0. Ou seja, DIV R4,0 ´ o equivalente a MOV R4,0. Por divis˜o inteira, entendemos a parte e a inteira do quociente da divis˜o (sem a parte fracion´ria). Por exemplo, a divis˜o inteira de 7 a a a por 2 ´ 3 (sendo o resto 1). e Existem seis comandos de fluxo de decis˜o: IFEQ (se igual), IFNEQ (se diferente), IFG (se a maior), IFL (se menor), IFGE (se maior ou igual) e IFLE (se menor ou igual). A sintaxe de todos eles ´ COMANDO OPERANDO1,OPERANDO2 (sem espa¸os entre a v´ e c ırgula e os operandos), onde OPERANDO1 e OPERANDO2 podem ser vari´veis (R0 a R9) ou valores inteiros (entre 0 e 999). Assim, a o comando IFEQ R4,123 ´ o equivalente a testar se R4 ´ igual a 123. Caso a condi¸ao testada seja e e c˜ verdadeira, o programa continua a executar normalmente a linha subseq¨ente ao comando de u decis˜o. Caso a condi¸˜o seja falsa, o programa passa a executar a linha subseq¨ente ao ENDIF a ca u mais pr´ximo. Todos os comandos de decis˜o devem ter um comando ENDIF correspondente. o a Finalmente, existem os comandos CALL e RET, ambos com a sintaxe COMANDO OPERANDO, onde OPERANDO ´ uma vari´vel (R0..R9) ou valor direto (entre 0 e 999). O comando CALL e a chama o pr´prio programa novamente, passando OPERANDO como parˆmetro de entrada, ou seja, o a atribuindo o valor de OPERANDO ` variavel R0. J´ RET termina a execu¸ao do programa, a a c˜ retornando o valor de OPERANDO como o resultado de sa´ ıda. A ultima linha do programa ´ sempre ser´ um comando RET. Observe que, caso o programa chame a si mesmo atrav´s a e do comando CALL, quando a execu¸˜o voltar, o valor de R9 vai estar alterado com o valor ca retornado pelo programa. Note tamb´m que todas as vari´veis (R0..R9) s˜o locais, ou seja, e a a uma chamada subseq¨ente ao programa n˜o pode alterar os valores guardados nas vari´veis da u a a

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

4

instˆncia anterior, com exce¸ao, naturalmente, do valor de R9 que recebe o retorno da instˆncia a c˜ a chamada. O exemplo a seguir ilustra um programa que calcula o fatorial de um n´mero. u 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

1a linha: Verifica se o valor de R0 vale 0, caso positivo, executa a pr´xima linha, caso o contr´rio, pula para a 4a linha (ENDIF mais pr´ximo). a o 2a linha: Retorna 1 como sa´ do programa. ıda 3a linha: Marca o fim do bloco de decis˜o iniciado na primeira linha. a 4a linha: Atribui o valor de R0 a R1 (R1 ← R0). 5a linha: Diminui 1 de R1 (R1 ← R1 - 1). 6a linha: Chama o programa passando R1 como parˆmetro de entrada. a 7a linha: Guarda o valor de R9 (retornado pela chamada anterior) em R2 (R2 ← R9) 8a linha: Multiplica o valor de R2 por R0 (R2 ← R2 * R0) 9a linha: Retorna o valor de R2 como sa´ do programa. ıda A tabela seguir traz um resumo dos comandos para referˆncia: e 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 execu¸˜o condicional ca Chama o programa com OP como entrada return OP

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

5

Entrada
A entrada cont´m v´rios casos de teste. Cada caso de teste se inicia com dois inteiros, L e N , e a representando respectivamente o n´mero de linhas do programa (1 ≤ L < 100) e o valor do u parˆmetro de entrada do programa (0 ≤ N < 1000). As L linhas seguintes contˆm o programa. a e Pode-se assumir que ele est´ sempre sintaticamente correto de acordo com as regras definidas a acima. Todos os comandos (bem como o nome das vari´veis) s´ conter˜o letras mai´sculas. O a o a u final da entrada ´ marcado pelo caso em que L = N = 0 e n˜o deve ser processado. e a A entrada deve ser lida da entrada padr˜o. a

Sa´ ıda
Para cada caso de teste, seu programa deve produzir uma linha contendo um inteiro que representa o valor de sa´ (retorno) para a entrada N dada, ou um asterisco (*) no caso de o ıda programa nunca terminar. A sa´da deve ser escrita na sa´da padr˜o. ı ı a Exemplo de entrada 9 6 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 0 0 Sa´ para o exemplo de entrada ıda 720 *

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

6

Problema C
Pa´ em Guerra ıses
Nome do arquivo fonte: paises.c, paises.cpp, paises.java ou paises.pas No ano 2050, ap´s diversas tentativas da ONU de manter a paz no mundo, explode a terceira o guerra mundial. Segredos industriais, comerciais e militares obrigaram todos os pa´ a utilizar ıses servi¸os de espionagem extremamente sofisticados, de forma que em cada cidade do mundo h´ c a ao menos um espi˜o de cada pa´ Esses espi˜es precisam se comunicar com outros espi˜es, com a ıs. o o informantes e mesmo com as suas centrais durante as suas a¸oes. Infelizmente n˜o existe uma c˜ a forma segura de um espi˜o se comunicar em um per´ a ıodo de guerra, ent˜o as mensagens s˜o a a sempre enviadas em c´digo para que somente o destinat´rio consiga ler a mensagem e entender o a o seu significado. Os espi˜es utilizam o unico servi¸o que funciona no per´ o ´ c ıodo de guerra, os correios. Cada cidade possui uma agˆncia postal onde as cartas s˜o enviadas. As cartas podem ser enviadas e a diretamente ao seu destino ou a outras agˆncias postais, at´ que a carta chegue ` agˆncia postal e e a e da cidade de destino, se isso for poss´ ıvel. Uma agˆncia postal na cidade A pode enviar diretamente uma carta impressa para a agˆncia e e 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 n˜o necessariamente o contr´rio). a a a Se n˜o houver um acordo entre as agˆncias A e B, a agˆncia A pode tentar enviar a carta a a e e quantas agˆncias for necess´rio para que a carta chegue ao seu destino, se isso for poss´ e a ıvel. Algumas agˆncias s˜o interligadas por meios eletrˆnicos de comunica¸ao, como sat´lites e e a o c˜ e fibras ´pticas. Antes da guerra, essas liga¸oes atingiam todas as agˆncias, fazendo com que o c˜ e uma carta fosse enviada de forma instantˆnea, mas durante o per´ a ıodo de hostilidades cada pa´ ıs passou a controlar a comunica¸ao eletrˆnica e uma agˆncia somente pode enviar uma carta c˜ o e ` outra agˆncia por meio eletrˆnico (ou seja, instantaneamente) se ela estiver no mesmo pa´ a e o ıs. Duas agˆncias, A e B, est˜o no mesmo pa´ se houver uma forma de uma carta impressa enviada e a ıs de uma das agˆncias ser entregue na outra agˆncia. e e O servi¸o de espionagem do seu pa´ conseguiu obter o conte´do de todos os acordos de c ıs u envios de mensagens existentes no mundo e deseja descobrir o tempo m´ ınimo para se enviar uma carta entre diversos pares de cidades. Vocˆ seria capaz de ajud´-lo? e a

Entrada
A entrada cont´m v´rios casos de teste. A primeira linha de cada caso de teste cont´m dois e a e 2 inteiros separados por um espa¸o, N (1 ≤ N ≤ 500) e E (0 ≤ E ≤ N ), indicando o n´mero de c u cidades (numeradas de 1 a N ) e de acordos de envio de mensagens, respectivamente. Seguem-se, ent˜o, E linhas, cada uma com trˆs inteiros separados por espa¸os, X, Y e H (1 ≤ X, Y ≤ N , a e c 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. a a Em seguida, haver´ uma linha com um inteiro K (0 ≤ K ≤ 100), o n´mero de consultas. a u Finalmente, vir˜o K linhas, cada uma representando uma consulta e contendo dois inteiros a separados por um espa¸o, O e D (1 ≤ O, D ≤ N ). Vocˆ deve determinar o tempo m´ c e ınimo para se enviar uma carta da cidade O ` cidade D. a O final da entrada ´ indicado por N = 0. e A entrada deve ser lida da entrada padr˜o. a

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

7

Sa´ ıda
Para cada caso de teste da entrada seu programa deve produzir K linhas na sa´ ıda. A I-´sima e linha deve conter um inteiro M , o tempo m´ ınimo, em horas, para se enviar uma carta na I´sima consulta. Se n˜o houver meio de comunica¸˜o entre as cidades da consulta, vocˆ deve e a ca e imprimir ”Nao e possivel entregar a carta”(sem acentos). Imprima uma linha em branco ap´s cada caso de teste. o A sa´da deve ser escrita na sa´da padr˜o. ı ı a Exemplo de entrada 4 1 2 3 4 2 5 1 1 1 4 4 3 1 2 3 3 1 3 3 0 5 2 1 4 3 3 5 10 8 7 6 Sa´ para o exemplo de entrada ıda 0 6 6 0 Nao e possivel entregar a carta 10 Nao e possivel entregar a carta 0

2 3 4 3 1 3 2 10 3 1 2 1 3 1 2 0

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

8

Problema D
Energia × Tempo
Nome do arquivo fonte: energia.c, energia.cpp, energia.java ou energia.pas ´ Paulo trabalha para uma grande empresa chamada Abaco Computadores e Manuten¸oes (ACM). c˜ O seu trabalho ´ prover manuten¸˜o de computadores de clientes da ACM, localizados em die ca versas partes do pa´ Por esta raz˜o, Paulo normalmente passa um bom n´mero de horas por ıs. a u semana dentro de avi˜es. Obviamente, Paulo sempre carrega consigo o seu laptop, de forma o que mesmo quando est´ viajando de avi˜o pode executar muitas tarefas relacionadas a seu a a trabalho. Como as baterias de laptops geralmente n˜o duram muito, Paulo tem estudado alternativas a para aumentar o tempo de dura¸ao da bateria durante vˆos. Ele descobriu que processadores c˜ o modernos podem operar a diversos n´ ıveis de freq¨ˆncia, oferecendo um compromisso entre ue desempenho e consumo de energia. A id´ia inicial de Paulo foi simplesmente configurar o seu e laptop na freq¨ˆncia mais baixa. No entanto, ele notou que isso n˜o era muito util, j´ que ue a ´ a as tarefas executavam muito lentamente no laptop, e n˜o haveria tempo de executar todas as a tarefas, de forma que a energia restante na bateria seria in´til. u Paulo notou, entretanto, que a influˆncia do n´ e ıvel freq¨ˆncia no desempenho varia de ue aplica¸˜o para aplica¸˜o, dependendo se elas s˜o limitadas por mem´ria, CPU ou E/S. Adicioca ca a o nalmente, como processadores modernos permitem que o n´ de freq¨ˆncia seja alterado por ıvel ue software, Paulo planeja utilizar esse mecanismo para aumentar o tempo de uso da bateria de seu laptop, de forma ainda a manter um desempenho razo´vel. Para levar em considera¸ao tanto a c˜ a energia como o desempenho, Paulo decidiu usar uma m´trica j´ bem conhecida, denominada e a Produto Energia × Tempo (mais conhecida pelo acrˆnimo em inglˆs, EDP, Energy × Delay o e Product). Paulo tem uma lista de programas que devem ser executados seq¨encialmente, e todas as u informa¸˜es sobre o tempo e a energia necess´rios para executar cada programa em cada n´ co a ıvel de freq¨ˆncia, al´m da informa¸˜o de quanta energia ´ gasta para fazer o processador mudar ue e ca e de freq¨ˆncia. No entanto, para testar sua nova id´ia, Paulo ainda tem um problema: como ue e a maioria dos administradores de sistema, ele n˜o gosta de programar. Ele est´ pedindo a a a sua ajuda, j´ que vocˆ ´ um grande amigo e um expert em algoritmos e programa¸˜o, para a e e ca determinar o n´ ıvel de freq¨ˆncia em que cada um de seus programas deve ser executado de ue forma a minimizar o EDP total.

Entrada
A entrada cont´m v´rios casos de testes. A primeira linha de um caso de teste cont´m quatro e a e inteiros F , P , E, e A, identificando respectivamente o n´mero de n´ u ıveis de freq¨ˆncia suportados ue pelo processador do laptop de Paulo (1 ≤ F ≤ 20), o n´mero de programas a serem executados u seq¨encialmente (1 ≤ P ≤ 5000), a energia necess´ria, em Joules, para trocar entre dois u a quaisquer n´ ıveis de freq¨ˆncia (1 ≤ E ≤ 100) e o tempo (em ms) para trocar entre quaisquer ue dois n´ ıveis de freq¨ˆncia (1 ≤ A ≤ 100). Os n´ ue ıveis de freq¨ˆncia s˜o identificados por inteiros ue a de 1 a F , e os programas s˜o identificados por inteiros de 1 a P . a As P × F linhas seguintes descrevem os programas, com F linhas para cada programa (as primeiras F linhas correspondem ao programa 1, as pr´ximas F linhas correspondem ao o programa 2, e assim por diante). A f-´sima linha correspondente ao programa p cont´m dois e e n´meros Ep,f e Ap,f , representando respectivamente a quantidade de energia (em Joules) e u

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

9

tempo (em ms) para executar o programa p no n´ ıvel de freq¨ˆncia f (1 ≤ Ep,f ≤ 1000 e ue 1 ≤ Dp,f ≤ 1000). No in´ de cada caso de teste o processador est´ no n´ 1 de freq¨ˆncia. ıcio a ıvel ue O final da entrada ´ indicada por F = P = E = A = 0. e A entrada deve ser lida da entrada padr˜o. a

Sa´ ıda
Para cada caso de teste da entrada, seu programa deve produzir uma linha na sa´ ıda, contendo o EDP m´ ınimo para executar seq¨encialmente o conjunto de programas de 1 a P (ou seja, na u ordem em que aparecem na entrada). A sa´da deve ser escrita na sa´da padr˜o. ı ı a Exemplo de entrada 2 3 10 10 50 120 100 90 500 600 600 500 400 1000 500 700 3 3 2 5 7 10 8 5 15 4 12 4 11 5 12 4 7 10 8 5 15 4 0 0 0 0 Sa´ para o exemplo de entrada ıda 656100 145

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

10

Problema E
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 e Damas. O tabuleiro ´ retangular, com N linhas e M colunas de pequenos quadrados arranjados e em uma grade N ×M . Os pequenos quadrados s˜o alternadamente coloridos com uma cor clara a e uma cor escura, no padr˜o usual de um tabuleiro de damas. Os quadrados de cor escura s˜o a a denominados “casas” (note no entanto que, por raz˜es de visualiza¸ao, os diagramas abaixo o c˜ mostram casas como quadrados brancos). No in´ do jogo, cada jogador tem um certo n´mero de pe¸as, posicionadas nas casas mais ıcio u c pr´ximas da borda do tabuleiro que o jogador escolher (os jogadores escolhem bordas opostas). o Durante o jogo, as pe¸as s´ podem ocupar as casas do tabuleiro. c o Um dos movimentos do jogo ´ “capturar” uma pe¸a do oponente, saltando sobre ela, die c agonalmente, para a casa adjacente al´m da pe¸a, casa esta que deve estar vazia. A pe¸a do e c c oponente ´ ent˜o removida do tabuleiro. As trˆs casas envolvidas na captura (a casa inicial de e a e sua pe¸a, a casa que cont´m a pe¸a do oponente e a casa vazia, onde sua pe¸a estar´ ap´s a c e c c a o jogada) devem estar diagonalmente alinhadas e devem ser diagonalmente adjacentes, como no diagrama abaixo.

Em MegaDamas uma pe¸a pode capturar pe¸as do oponente saltando diagonalmente para c c a frente ou para tr´s (note que, na maioria das varia¸˜es existentes do jogos de Damas, uma a co pe¸a s´ pode capturar pe¸as oponentes saltando para a frente). Vocˆ pode tamb´m efetuar uma c o c e e captura m´ltipla, com uma pe¸a apenas, saltando seguidamente para casas vazias sobre pe¸as u c c oponentes. Em uma captura m´ltipla, a sua pe¸a pode mudar de dire¸ao, saltando primeiro u c c˜ em uma dire¸ao e depois em outra. Vocˆ pode capturar apenas uma pe¸a a cada salto, mas c˜ e c pode capturar v´rias pe¸as com saltos seguidos. Vocˆ n˜o pode saltar sobre uma pe¸a sua, e a c e a c n˜o pode saltar a mesma pe¸a oponente mais de uma vez. a c ´ S˜o dadas as dimens˜es do tabuleiro e uma descri¸ao do estado corrente de um jogo. E a a o c˜ sua vez de jogar e vocˆ deve determinar o n´mero m´ximo de pe¸as do seu oponente que podem e u a c ser capturadas em um movimento de captura.

Entrada
A entrada cont´m v´rios casos de teste. A primeira linha de um caso de teste cont´m dois e a e inteiros N e M indicando respectivamente o n´mero de linhas e o n´mero de colunas do tabuleiro u u (3 ≤ N ≤ 20, 3 ≤ M ≤ 20 e N × M ≤ 200). O quadrado mais ` esquerda do tabuleiro na borda a mais pr´xima ao jogador ´ uma casa. A segunda linha cont´m a descri¸˜o do estado do jogo. o e e ca

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

11

Cada descri¸˜o consiste de (N × M )/2 inteiros, separados por um espa¸o, correspondendo ca c `s casas do tabuleiro, que s˜o numeradas de 1 a (N × M )/2 , da esquerda para a direita, da a a borda mais pr´xima ao jogador ` borda mais pr´xima ao seu oponente. Na descri¸ao do estado o a o c˜ do jogo, ‘0’ representa uma casa vazia, ‘1’ representa uma casa com uma de suas pe¸as, e ‘2’ c representa uma casa com uma pe¸a de seu oponente. H´ no m´ximo (N × M )/4 pe¸as de c a a c cada jogador no tabuleiro. O final da entrada ´ indicado por N = M = 0. e
29 25 21 17 13 9 5 1 2 10 6 3 18 14 11 7 4 26 22 19 15 12 8 1 30 27 23 20 16 4 3 2 31 28 24 7 6 5 8 32

(a)

(b)

Figura 1: Numera¸ao das casas em (a) tabuleiro de dimens˜es 8 × 8 e em (b) tabuleiro de c˜ o dimens˜es 5 × 3. o A entrada deve ser lida da entrada padr˜o. a

Sa´ ıda
Para cada caso de teste da entrada, seu programa deve produzir uma unica linha na sa´ con´ ıda, tendo um inteiro indicando o maior n´mero de pe¸as de seu oponente que podem ser capturadas u c em uma jogada. A sa´da deve ser escrita na sa´da padr˜o. ı ı a Exemplo de entrada 3 2 5 1 8 2 0 3 1 2 0 1 3 0 2 1 0 2 0 0 8 2 2 2 0 0 0 0 2 2 2 2 0 0 0 0 2 2 2 2 0 0 0 0 2 2 2 2 0 1 0 0 0

Sa´ para o exemplo de entrada ıda 1 2 7

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

12

Problema F
Copa do Mundo
Nome do arquivo fonte: copa.c, copa.cpp, copa.java ou copa.pas Uma Copa do Mundo de futebol de bot˜es est´ sendo realizada com times de todo o mundo. o a A classifica¸ao ´ baseada no n´mero de pontos ganhos pelos times, e a distribui¸ao de pontos c˜ e u c˜ ´ feita da forma usual. Ou seja, quando um time ganha um jogo, ele recebe 3 pontos; se o jogo e termina empatado, ambos os times recebem 1 ponto; e o perdedor n˜o recebe nenhum ponto. a Dada a classifica¸ao atual dos times e o n´mero de times participantes na Copa do Mundo, c˜ u sua tarefa ´ de determinar quantos jogos terminaram empatados at´ o momento. e e

Entrada
A entrada cont´m v´rios casos de teste. A primeira linha de um caso de teste cont´m dois e a e inteiros T e N , indicando respectivamente o n´mero de times participantes (2 ≤ T ≤ 200) e u o n´mero de partidas jogadas (0 ≤ N ≤ 10000). Cada uma das T linhas seguintes cont´m o u e nome de um time (uma cadeia de m´ximo 10 letras e d´ a ıgitos), seguido de um espa¸o em branco, c seguido do n´mero de pontos que o time obteve at´ o momento. O final da entrada ´ indicado u e e por T = 0. A entrada deve ser lida da entrada padr˜o. a

Sa´ ıda
Para cada um dos casos de teste seu programa deve imprimir uma unica linha contendo um ´ n´mero inteiro, representando a quantidade de jogos que terminaram empatados at´ o momento. u e A sa´da deve ser escrita na sa´da padr˜o. ı ı a Exemplo de entrada 3 3 Brasil 3 Australia 3 Croacia 3 3 3 Brasil 5 Japao 1 Australia 1 0 0 Sa´ para o exemplo de entrada ıda 0 2

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

13

Problema G
Rota Cr´ ıtica
Nome do arquivo fonte: rota.c, rota.cpp, rota.java ou rota.pas Uma trag´dia aconteceu recentemente em sua cidade. Um paciente em condi¸ao cr´ e c˜ ıtica, que necessitava tratamento urgente, morreu enquanto era transportado para um grande hospital da capital do estado. O que ocorreu foi que a ambulˆncia ficou presa no trˆnsito, devido a a a uma rocha que deslizou na estrada. A popula¸ao reclamou com o governador, que agora deseja c˜ evitar acontecimentos similares no futuro. Infelizmente, deslizamentos de rochas s˜o muito a comuns nesse estado, com muitas montanhas e serras. Assim, para minimizar o n´mero de u trag´dias devidas a deslizamentos de rochas e outros imprevistos, o governador decidiu criar e rotas alternativas entre cada cidade do estado e a capital. Para isso, ´ necess´rio inicialmente e a identificar quais segmentos de estradas s˜o atualmente cr´ a ıticos, isto ´, se bloqueados causam e que n˜o haja caminho poss´ entre alguma cidade e a capital. Um segmento de estrada ´ um a ıvel e trecho de estrada que liga duas cidades distintas. Sua tarefa ´ escrever um programa para identificar esses segmentos cr´ e ıticos de estradas.

Entrada
A entrada ´ composta de v´rios casos de testes. A primeira linha de um caso de teste cont´m e a e dois inteiros N e M que indicam respectivamente o n´mero de cidades (2 ≤ N ≤ 100) e u o n´mero de segmentos de estrada (1 ≤ M ≤ 10000). Cada uma das N linhas seguintes u cont´m o nome de uma cidade (apenas letras min´sculas e mai´sculas, comprimento m´ximo e u u a de 20 caracteres). A primeira dessas cidades ´ a capital do estado. Cada uma das M linhas e seguintes descreve um segmento de estrada, contendo um par de nomes de cidades separados por um espa¸o em branco. Note que, como as montanhas causam dificuldade na constru¸ao c c˜ de estradas, muitos segmentos de estrada s˜o de m˜o unica. Um segmento com duas m˜os ´ a a ´ a e representado por dois trechos de m˜o unica. Vocˆ deve supor que existe ao menos um caminho a ´ e de cada cidade para a capital. O final da entrada ´ indicado por N = M = 0. e A entrada deve ser lida da entrada padr˜o. a

Sa´ ıda
Para cada caso de teste seu programa deve listar os segmentos cr´ ıticos, com um segmento cr´ ıtico por linha. Cada segmento cr´ ıtico deve ser representado por dois nomes de cidades separados por um espa¸o em branco. Os segmentos cr´ c ıticos 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 n˜o existir nenhum segmento cr´ a ıtico seu programa deve imprimir uma linha contendo apenas a palavra “Nenhuma”. Imprima uma linha em branco ap´s cada caso de teste. o A sa´da deve ser escrita na sa´da padr˜o. ı ı a

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

14

Exemplo de entrada 6 10 PortoAlegre Gramado Canela NovoHamburgo Pelotas RioGrande Canela Gramado Canela NovoHamburgo Gramado NovoHamburgo NovoHamburgo PortoAlegre PortoAlegre NovoHamburgo RioGrande Pelotas Pelotas PortoAlegre PortoAlegre Pelotas Pelotas RioGrande NovoHamburgo Canela 3 5 Sacramento SanFrancisco SantaClara SanFrancisco Sacramento Sacramento SantaClara SantaClara SanFrancisco SanFrancisco Sacramento Sacramento SanFrancisco 3 4 Recife Olinda Paulista Olinda Recife Paulista Recife Olinda Paulista Paulista Olinda 0 0

Sa´ para o exemplo de entrada ıda Gramado NovoHamburgo NovoHamburgo PortoAlegre RioGrande Pelotas Pelotas PortoAlegre SantaClara SanFrancisco Nenhuma

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

15

Problema H
Amigos ou Inimigos?
Nome do arquivo fonte: amigos.c, amigos.cpp, amigos.java ou amigos.pas Um determinado ex´rcito numa certa fronteira decidiu enumerar as coordenadas em sua volta e de maneira a tornar dif´ para o inimigo saber a quais posi¸˜es eles est˜o se referindo no ıcil co a caso de o sinal de r´dio usado para comunica¸ao ser interceptado. O processo de enumera¸ao a c˜ c˜ escolhido foi o seguinte: primeiro decide-se onde ficam os eixos x e y; a seguir, define-se uma equa¸˜o linear que descreva a posi¸ao da fronteira em rela¸˜o aos eixos (sim, ela ´ uma linha ca c˜ ca e reta); finalmente, enumeram-se todos os pontos do plano cartesiano que n˜o fazem parte da a fronteira, sendo o n´mero 0 atribu´ ` coordenada (0,0) e da´ em diante atribuindo-se os u ıdo a ı n´meros para as coordenadas inteiras seguindo uma espiral de sentido hor´rio, sempre pulando u a os pontos que caem em cima da fronteira (veja a Figura 1). Caso o ponto (0,0) caia em cima da fronteira, o n´mero 0 ´ atribu´ ao primeiro ponto que n˜o fa¸a parte da fronteira seguindo u e ıdo a c a ordem especificada.

Figura 2: Enumera¸˜o dos pontos das coordenadas inteiras ca De fato o inimigo n˜o tem como saber a qual posi¸ao o ex´rcito se refere, a n˜o ser que o a c˜ e a inimigo saiba o sistema usado para enumerar os pontos. Tal esquema, por´m, complicou a vida e do ex´rcito, uma vez que ´ dif´ determinar se dois pontos quaisquer est˜o no mesmo lado da e e ıcil a ´ ı fronteira ou em lados opostos. E a´ que eles precisam da sua ajuda.

Entrada
A entrada cont´m v´rios casos de teste. A primeira linha da entrada cont´m um inteiro N e a e (1 ≤ N ≤ 100) que representa a quantidade de casos de teste. Seguem-se os N casos de teste. A primeira linha de cada caso de teste cont´m dois inteiros a e b (−5 ≤ a ≤ 5 e −10 ≤ b ≤ 10), e que descrevem a equa¸˜o da fronteira: y = ax + b. A segunda linha de cada caso de teste ca cont´m um inteiro K, indicando a quantidade de consultas que se seguem (1 ≤ K ≤ 1000). e Cada uma das K linhas seguintes descreve uma consulta, sendo composta por dois inteiros M e N representando as coordenadas enumeradas de dois pontos (0 ≤ M, N ≤ 65535). A entrada deve ser lida da entrada padr˜o. a

Maratona de Programa¸˜o da SBC – ACM ICPC –2006 ca

16

Sa´ ıda
Para cada caso de teste da entrada seu programa deve produzir K + 1 linhas. A primeira linha deve conter a identifica¸˜o do caso de teste na forma Caso X, onde X deve ser substitu´ pelo ca ıdo n´mero do caso (iniciando de 1). As K seguintes devem conter os resultados das K consultas u feitas no caso correspondente da entrada, na forma: Mesmo lado da fronteira ou Lados opostos da fronteira A sa´da deve ser escrita na sa´da padr˜o. ı ı a Exemplo de entrada 2 1 2 10 26 25 25 11 24 9 23 28 25 9 25 1 25 0 9 1 23 12 26 17 1 2 12 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 Sa´ para o exemplo de entrada ıda Caso 1 Mesmo lado da Mesmo lado da Mesmo lado da Mesmo lado da Mesmo lado da Lados opostos Lados opostos Lados opostos Lados opostos Lados opostos Caso 2 Mesmo lado da Mesmo lado da Mesmo lado da Mesmo lado da Mesmo lado da Mesmo lado da Mesmo lado da Mesmo lado da Lados opostos Mesmo lado da Mesmo lado da Lados opostos fronteira fronteira fronteira fronteira fronteira da fronteira da fronteira da fronteira da fronteira da fronteira fronteira fronteira fronteira fronteira fronteira fronteira fronteira fronteira da fronteira fronteira fronteira da fronteira