Vous êtes sur la page 1sur 28

acm

International Collegiate
Programming Contest
event
sponsor
2012
Maratona de Programao da SBC 2012
Sub-Regional Brasil do ACM ICPC
15 de Setembro de 2012
Caderno de Problemas e Solues
Promoo:
Patrocnio:
v1.0
Maratona de Programao da SBC ACM ICPC 2012 1
Problema A
Concurso de Contos
Arquivo: concurso.[c|cpp|java]
Machado gosta muito de escrever. J escreveu muitos contos, resenhas, relatos de viagens que fez,
alm de um pequeno romance. Agora Machado quer participar de um concurso de contos, que tem
regras muito rgidas sobre o formato de submisso do conto.
As regras do concurso especicam o nmero mximo de caracteres por linha, o nmero mximo de
linhas por pgina, alm de limitar o nmero total de pginas. Adicionalmente, cada palavra deve ser
escrita integralmente em uma linha (ou seja, a palavra no pode ser separada silabicamente em duas
linhas). Machado quer escrever um conto com o maior nmero de palavras possvel, dentro das regras
do concurso, e precisa de sua ajuda.
Dados o nmero mximo de caracteres por linha, o nmero mximo de linhas por pgina, e as
palavras do conto que Machado est escrevendo, ele quer saber o nmero mnimo de pginas que seu
conto utilizaria seguindo as regras do concurso.
Entrada
A primeira linha de um caso de teste contm trs inteiros N, L e C, que indicam, respectivamente,
o nmero de palavras do conto de Machado, o nmero mximo de linhas por pgina e o nmero mximo
de caracteres por linha. O conto de Machado inovador e no contm nenhum caractere alm de letras
maisculas e minsculas e espaos em branco, sem letras acentuadas e sem cedilha. A segunda linha
contm o conto de Machado, composto de N palavras separadas por espaos em branco; h espao em
branco somente entre duas palavras, e entre duas palavras h exatamente um espao em branco.
Sada
Para cada caso de teste imprima uma nica linha, contendo um nico nmero inteiro, indicando o
nmero mnimo de pginas que o conto de Machado ocupa, considerando as regras do concurso.
Restries
2 N 1000
1 L 30
1 C 70
1 comprimento de cada palavra C
Maratona de Programao da SBC ACM ICPC 2012 2
Exemplos
Exemplo de entrada
14 4 20
Se mana Piedade tem casado com Quincas Borba apenas me daria uma esperanca colateral
16 3 30
No dia seguinte entrou a dizer de mim nomes feios e acabou alcunhando me Dom Casmurro
5 2 2
a de i de o
5 2 2
a e i o u
Sada para o exemplo de entrada
2
1
3
3
Soluo
Em primeiro lugar, como o comprimento de cada palavra menor ou igual ao comprimento de cada
linha, sempre possvel escrever o conto obedecendo s restries do concurso: por exemplo, Machado
pode escrever uma palavra em cada linha.
Observe tambm que no importam exatamente quais so as palavras usadas por Machado, mas
apenas o nmero de caracteres de cada uma. Isso permite simplicar o problema: no preciso
armazenar todas as palavras da entrada, mas apenas seus comprimentos (por exemplo, em um vetor
de 1000 inteiros).
O comprimento de uma linha de N palavras, de comprimentos c
1
, c
2
, . . . , c
N
c
1
+ 1 + c
2
+ 1 +
+ 1 + c
N
, onde os + 1 + correspondem aos espaos em branco entre palavras consecutivas.
Em particular, adicionar uma palavra de comprimento c
N+1
a uma linha gasta c
N+1
+ 1 caracteres.
Isso nos d um algoritmo para contar o nmero total de linhas necessrias:
1. Inicialmente, temos s uma linha, cujo comprimento x igual ao comprimento da primeira
palavra, c
1
.
2. Para cada palavra p
i
: ser verdade que x + 1 +c
i
C?
3. Se sim, a palavra p
i
cabe na linha; faa x x + 1 +c
i
;
4. Se no, a palavra p
i
no cabe na linha: precisaremos de mais uma linha no conto. Essa linha,
pelo menos inicialmente, s contm a palavra p
i
: faa x c
i
e aumente o contador de linhas.
A ideia crucial aqui a do passo 4: no importa quantas palavras j escrevemos ou faltam escrever:
s interessa o comprimento da ltima linha do conto! Assim, no precisamos saber exatamente, o
tempo todo, a disposio das palavras nas pginas; basta saber quanto espao temos (ou no caso,
quanto espao j usamos) na ltima linha at ento escrita, que o papel da varivel x.
E agora que sabemos quantas linhas o conto ocupa, como fazemos para contar o nmero de pginas?
Se gastamos k linhas, precisamos de

k
L

pginas, j que podemos colocar s L linhas por pgina (e no


Maratona de Programao da SBC ACM ICPC 2012 3
podemos contar fraes de pgina). Na maioria das linguagens de programao, a diviso de inteiros
encontra o piso, e no o teto, da diviso, mas isso pode ser contornado usando a identidade

k
L

k + (L 1)
L

Maratona de Programao da SBC ACM ICPC 2012 4


Problema B
Tobogan de bolinhas
Arquivo: tobogan.[c|cpp|java]
Uma fbrica quer produzir um tobogan de brinquedo como o da gura abaixo, composto de duas
hastes de madeira sustentando aletas que se alternam nas duas hastes. Uma bolinha de ao solta na
aleta mais alta do tobogan; sob efeito da gravidade, a bolinha desliza pelas aletas, terminando por sair
do brinquedo.
L
H
O projeto do brinquedo, contendo as especicaes do tamanho, posio e inclinao das hastes e
de cada aleta, foi feito pelo dono da fbrica, e milhares de unidades j esto sendo confeccionadas na
China. O gerente da fbrica foi incumbido de comprar as bolinhas de ao, mas antes de fazer o pedido
das milhares de bolinhas quer saber o dimetro mximo da bolinha, para que esta no pare no meio
do brinquedo.
(a) (b)
Figura 1: Dois exemplos: em (a) a bolinha chega ao nal, e (b) a bolinha para no meio do brinquedo
e no chega ao nal.
O gerente da fbrica quer que voc escreva um programa que, dadas as especicaes do brinquedo,
determine o dimetro mximo da bolinha para que esta no pare no meio do brinquedo.
Entrada
A primeira linha de um caso de teste contm um inteiro N indicando o nmero de aletas do
brinquedo. A segunda linha contm dois inteiros L e H, indicando respectivamente a distncia entre
as hastes e a altura das hastes do brinquedo. A haste esquerda do brinquedo est na posio 0 do eixo
de coordenadas X, de forma que a haste direita est na posio L do eixo X.
Cada uma das N linhas seguintes descreve uma aleta. As aletas so descritas da mais alta para a
mais baixa, de forma alternada em relao haste na qual a aleta est conectada. A aleta mais alta
Maratona de Programao da SBC ACM ICPC 2012 5
do brinquedo (a primeira a ser descrita) tem a extremidade ligada haste esquerda; a segunda aleta
mais alta (a segunda a ser descrita) tem a extremidade ligada haste direita, assim alternadamente.
As aletas mpares tm a extremidade ligada haste esquerda, as aletas pares tm a extremidade ligada
haste direita.
Cada aleta descrita em uma linha contendo trs nmeros inteiros Y
i
, X
f
e Y
f
, separados por um
espao em branco. (X
f
, Y
f
) indica a coordenada do nal da aleta; para aletas mpares a coordenada
do incio da aleta (0, Y
i
), e para aletas pares a coordenada do incio da aleta (L, Y
i
).
Para todas as aletas Y
i
> Y
f
(ou seja, h um declive entre o incio e o nal da aleta), e o comprimento
da aleta menor do que a largura do brinquedo. Alm disso, para duas aletas consecutivas A e B,
Y
fA
>= Y
iB
(ou seja, o nal da aleta A tem altura maior do que ou igual ao incio da aleta B).
Considere que as aletas so muito nas, de forma que a sua espessura pode ser desconsiderada, e
que a sua largura sempre maior do que o dimetro da bolinha (ou seja, a bolinha sempre tem espao
lateral para deslizar pela aleta).
Sada
Para cada caso de teste imprima uma linha contendo um nico nmero, com exatamente duas casas
decimais, indicando o maior dimetro de bolinha tal que esta consiga percorrer todo o brinquedo.
Restries
1 N 10
3
1 L 10
3
1 H 10
3
0 < X
f
< L
0 Y
i
H, 0 Y
f
H e Y
i
> Y
f
Exemplos
Exemplo de entrada
3
6 10
9 3 8
6 2 5
4 3 1
3
5 10
9 3 7
7 2 4
2 3 0
Sada para o exemplo de entrada
2.00
1.41
Soluo
Devido congurao das aletas, basta determinar a distncia horizontal entre o ponto da extremi-
dade livre de cada aleta para a haste oposta, e entre esse mesmo ponto e a aleta seguinte na sequncia
Maratona de Programao da SBC ACM ICPC 2012 6
de aletas (distncia ponto segmento de reta). A resposta o menor valor entre todas as distncias
calculadas.
Maratona de Programao da SBC ACM ICPC 2012 7
Problema C
Cartes
Arquivo: cartoes.[c|cpp|java]
Dois jogadores, Alberto e Wanderley, disputam um jogo. Um conjunto com um nmero par de
cartes contendo nmeros inteiros disposto sobre uma mesa, um ao lado do outro, formando uma
sequncia. Alberto comea, e pode pegar um dos dois cartes das pontas. Wanderley ento pode pegar
um dos dois cartes das pontas e novamente Alberto pode pegar um carto das pontas, e assim por
diante, at Wanderley pegar o ltimo carto.
Alberto, o primeiro a jogar, tem como objetivo maximizar o nmero total de pontos que ele con-
segue, somando os valores dos cartes escolhidos. Wanderley, o segundo jogador, quer atrapalhar o
Alberto e fazer com que ele consiga o menor nmero de pontos possvel. Em suma, ambos querem fazer
o melhor possvel, Alberto querendo maximizar sua soma e Wanderley querendo minimizar a soma de
Alberto.
Voc deve escrever um programa que, dada a sequncia de cartes, determine o maior nmero de
pontos que Alberto consegue obter.
Entrada
Cada caso de teste descrito em duas linhas. A primeira linha contm um inteiro, N, que indica o
nmero de cartes sobre a mesa. A segunda contm N inteiros, que descrevem a sequncia de cartes.
Sada
Para cada caso de teste seu programa deve imprimir uma nica linha, contendo um nico inteiro,
o maior nmero de pontos que Alberto consegue obter.
Restries
2 N 10
4
N par
cada um dos N inteiros pode ser representado com 32 bits.
Exemplos
Exemplo de entrada
4
0 -3 5 10
4
0 -3 5 7
4
47 50 -3 7
Sada para o exemplo de entrada
10
7
57
Maratona de Programao da SBC ACM ICPC 2012 8
Soluo
Sejam t
1
, t
2
, . . . , t
n
os n inteiros, n par. Basta fazer uma pd da seguinte forma:
f(i, j) =

max(t
i
, t
j
), se j = i + 1
max(t
i
+ min(f(i + 1, j 1), f(i + 2, j)), t
j
+ min(f(i + 1, j 1), f(i, j 2))).
A resposta ser f(1, n).
Dados os limites, as somas no passam de 10
14
em valor absoluto.
Maratona de Programao da SBC ACM ICPC 2012 9
Problema D
Coral Perfeito
Arquivo: coral.[c|cpp|java]
A Maestrina do coral est planejando o espetculo que apresentar na famosa Semana Brasileira
de Corais. Ela pensou em preparar uma nova msica, denida da seguinte maneira:
cada um dos integrantes do coral inicia cantando uma nota, e somente muda de nota quando
determinado pela Maestrina;
ao nal de cada compasso, a Maestrina determina que exatamente dois integrantes alterem a nota
que cantam: um integrante passa a cantar a nota imediatamente acima da nota que cantava, e o
outro integrante passa a cantar a nota imediatamente abaixo da nota que cantava;
a msica termina ao nal do primeiro compasso em que todos os integrantes do coral cantam a
mesma nota.
A Maestrina j tem vrias ideias de como distribuir as notas no incio da msica entre os integrantes
do coral, de forma a criar o efeito desejado. No entanto, ela est preocupada em saber se, dada uma
distribuio de notas entre os integrantes, possvel chegar ao nal da msica da forma desejada (todos
cantando a mesma nota) e, caso seja possvel, qual o nmero mnimo de compassos da msica. Voc
pode ajud-la?
Entrada
A primeira linha de um caso de teste contm um inteiro N indicando o nmero de integrantes
do coral. As notas sero indicadas por nmeros inteiros. A segunda linha contm N nmeros intei-
ros, indicando as notas iniciais que cada integrante deve cantar. As notas so dadas em ordem no
decrescente de altura.
Sada
Para cada caso de teste imprima uma linha contendo um nico nmero inteiro indicando o nmero
mnimo de compassos que a msica ter. Se no possvel terminar a msica com todos os integrantes
cantando a mesma nota, imprima o valor 1.
Restries
2 N 10
4
10
5
nota
i
10
5
para 0 i N 1
nota
i
nota
i+1
para 0 i N 2
Maratona de Programao da SBC ACM ICPC 2012 10
Exemplos
Exemplo de entrada
3
1 2 3
4
3 6 9 12
6
1 2 3 4 5 723
5
10 10 10 10 10
Sada para o exemplo de entrada
2
-1
601
1
Soluo
Primeiramente, voc deve notar que somente ser possvel todos os cantores chegarem a uma mesma
nota se a mdia dos valores dados na entrada for um nmero inteiro. Se a mdia no for um nmero
inteiro, a resposta -1.
Considere agora os cantores que iniciaram em notas com valores abaixo da mdia. Para cada cantor
nessa situao, o nmero de compassos que ele necessitar para chegar nota mdia a diferena entre
o valor de sua nota inicial e a nota mdia. Como a cada passo apenas um dos cantores que iniciaram
em notas abaixo da mdia diminui a sua distncia da nota mdia, o tempo total para que os cantores
que iniciaram em notas abaixo da mdia cantem a nota mdia a somatria das diferenas entre a
mdia e cada nota menor do que a mdia.
Maratona de Programao da SBC ACM ICPC 2012 11
Problema E
Elevador Espacial
Arquivo: elevador.[c|cpp|java]
A China est construindo um elevador espacial, que permitir o lanamento de sondas e satlites a
um custo muito mais baixo, viabilizando no s projetos de pesquisa cientca como o turismo espacial.
No entanto, os chineses so muito supersticiosos, e por isso tm um cuidado muito especial com
a numerao dos andares do elevador: eles no usam nenhum nmero que contenha o dgito 4 ou a
sequncia de dgitos 13. Assim, eles no usam o andar 4, nem o andar 13, nem o andar 134, nem o
andar 113, mas usam o andar 103. Assim, os primeiros andares so numerados 1, 2, 3, 5, 6, 7, 8, 9, 10,
11, 12, 15, 16, . . .
Como o elevador espacial tem muitos andares, e eles precisam numerar todos os andares do elevador,
os chineses pediram que voc escrevesse um programa que, dado o andar, indica o nmero que deve
ser atribudo a ele.
Entrada
Cada caso de teste consiste de uma nica linha, contendo um inteiro N que indica o andar cujo
nmero deve ser determinado.
Sada
Para cada caso de teste, imprima uma linha contendo um nico nmero inteiro indicando o nmero
atribudo ao N-simo andar.
Restries
1 N 10
18
Exemplos
Exemplo de entrada
1
4
11
12
440
Sada para o exemplo de entrada
1
5
12
15
666
Soluo
O problema determinar o N-simo inteiro positivo que no contm as sequncias de dgitos 4
ou 13 na sua representao decimal.
Por incluso/excluso, fcil calcular quantos nmeros da forma 1xx. . . x e xx. . . x so botes
vlidos de elevador em funo apenas da quantidade de x; esses valores podem ser pr-computados e
compilados num vetor no cdigo do programa.
Maratona de Programao da SBC ACM ICPC 2012 12
A partir da fcil calcular quantos nmeros vlidos existem, por exemplo, de 1 a 2816: podemos
contar os inteiros vlidos nos intervalos [0, 999], [1000, 1999], [2000, 2099], [2100, 2199], . . . , [2700, 2799],
[2800, 2809], [2810, 2810], [2811, 2811], . . . , [2816, 2816].
Maratona de Programao da SBC ACM ICPC 2012 13
Problema F
Perdido na Noite
Arquivo: perdido.[c|cpp|java]
Numa cidade da Nlognia, o sistema virio composto de N rotatrias e N 1 ruas, sendo que
cada rua liga duas rotatrias distintas. Utilizando o sistema virio, possvel ir de qualquer rotatria
para qualquer outra rotatria da cidade.
A cidade possui apenas dois hotis: um barato, localizado na rotatria B, e um caro, localizado na
rotatria C. Um turista veio cidade para celebrar o aniversrio de um amigo, cuja festa est sendo
realizada em um clube localizado na rotatria A. Como o turista no fez reserva em nenhum dos hotis
e a noite est agradvel, aps a festa ele decidiu passear a p pelas ruas e rotatrias at encontrar um
dos hotis (ele tambm decidiu hospedar-se no primeiro hotel que encontrar).
Seu plano foi dicultado porque como ele no conhece a cidade e bebeu um pouco alm da conta,
todas as ruas lhe parecem iguais. Assim, ele decidiu usar a seguinte estratgia: a cada rotatria ele
escolhe, com probabilidade uniforme, uma das ruas que saem da rotatria, e usa essa rua para ir a uma
outra rotatria, at chegar rotatria onde um dos hotis est localizado. Note que como o turista
no consegue distinguir as ruas, pode ocorrer de ele escolher a mesma rua pela qual chegou rotatria.
Voc deve escrever um programa que, dadas a descrio do sistema virio, a localizao A da
festa de aniversrio, a localizao B do hotel barato e a localizao C do hotel caro, determine a
probabilidade de o turista chegar ao hotel barato antes de chegar ao hotel caro.
Entrada
A primeira linha de um caso de teste contm quatro inteiros N, A, B e C, indicando respectivamente
o nmero de rotatrias do sistema virio, a rotatria onde a festa de aniversrio foi realizada, a rotatria
onde o hotel barato est localizado, e a rotatria onde o hotel caro est localizado. Cada uma das
N 1 linhas seguintes contm dois inteiros X e Y , indicando que existe uma rua que liga as rotatrias
X e Y .
Sada
Seu programa deve imprimir uma nica linha, contendo a probabilidade de o turista chegar ao hotel
barato antes de chegar ao hotel caro, com 6 casas decimais.
Restries
3 N 100
B ,= C, A ,= B, A ,= C.
1 A, B, C N
1 X, Y N.
X ,= Y .
Maratona de Programao da SBC ACM ICPC 2012 14
Exemplos
Exemplo de entrada
4 1 2 3
1 4
2 4
3 4
5 3 1 5
1 2
2 3
3 4
4 5
Sada para o exemplo de entrada
0.500000
0.500000
Soluo
Note que, pela descrio, o sistema virio pode ser modelado como uma rvore T onde as rotatrias
so os vrtices e as ruas so as arestas.
Trs solues possveis para o problema so:
Seja P o caminho entre B e C, de comprimento l
B,C
. Seja w o vrtice mais prximo de A que
faz parte de P (possivelmente A = w). Seja l
w
a distncia entre B e w. Ento a resposta dada
por l
w
/l
B,C
.
Considerar a rvore T como uma cadeia de Markov, adicionando self-loops de probabilidade 1
em B e C. Encontrar a distribuio estacionria.
Analogia com circuitos: considerando cada aresta como um resistor de 1 ohm, aplicando-se uma
tenso de 1V entre B e C, a tenso entre um vrtice x e C nos d a probabilidade de chegar
antes em B que em C.
Maratona de Programao da SBC ACM ICPC 2012 15
Problema G
Grid de Largada
Arquivo: grid.[c|cpp|java]
Na Nlognia, vai ser realizada a sensacional nal mundial da frmula 17. Os competidores se
alinham na largada e disputam a corrida. Voc vai ter acesso aos grids de largada e de chegada. A
questo determinar o nmero mnimo de ultrapassagens que foram efetuadas durante a competio.
Entrada
Cada caso de teste utiliza trs linhas. A primeira linha de um caso de teste contm um inteiro N
indicando o nmero de competidores. Cada competidor identicado com um nmero de 1 a N. A
segunda linha de cada caso tem os N competidores, em ordem do grid de largada. A terceira linha de
cada caso tem os mesmos competidores, porm agora na ordem de chegada.
Sada
Para cada caso de teste imprima uma linha contendo um nico nmero inteiro, que indica o nmero
mnimo de ultrapassagens necessrias para se chegar do grid de largada ao grid de chegada.
Restries
2 N 24
Exemplos
Exemplo de entrada
5
1 2 3 4 5
3 1 2 5 4
5
3 1 2 5 4
1 2 3 4 5
5
3 1 2 5 4
5 3 2 1 4
Sada para o exemplo de entrada
3
3
4
Soluo
Para descrever a soluo deste problema, vamos inicialmente denir um conceito importante para
o problema de ordenao. Uma inverso em uma sequncia de elementos A[1..N] um par (i, j) para
o qual i < j e A[i] > A[j]. O nmero de inverses de uma sequncia indica portanto o nmero de
pares de elementos que esto fora de ordem. O nmero de inverses muito usado como medida da
ordenao de uma sequncia, e importante na anlise da complexidade de algoritmos de ordenao.
Considere os grids de largada e chegada como vetores. Considere ainda que o vetor de chegada
representa a ordenao correta dos elementos. Ento, o nmero mnimo de ultrapassagens igual ao
Maratona de Programao da SBC ACM ICPC 2012 16
nmero de inverses do vetor de chegada em relao ao vetor de largada, ou seja, o nmero de trocas
(ultrapassagens) necessrias para ordenar corretamente o vetor de largada.
O algoritmo mais simples para contar o nmero de inverses aplicar diretamente a denio de
inverso: para cada elemento A[j] do vetor, conte quantos elementos existem tais que A[i] > A[j] e
i < j. Note que esse algoritmo tem complexidade N
2
, mas pode ser utilizado considerando os limites
deste problema.
Algoritmos de ordenao padro tambm podem ser modicados para contar o nmero de inverses
de um vetor. Considerando os limites do problema, qualquer algoritmo de ordenao pode ser usado
como soluo. Por exemplo, pode-se utilizar o mtodo da bolha (bubble sort), que muito simples de
implementar e no pior caso tem complexidade O(N
2
), mas no melhor caso tem complexidade O(N).
Utilize um contador de trocas, inicialmente zero. Em cada passo, compare cada par de elementos
vizinhos do vetor, efetuando a troca (e atualizando o contador) se necessrio. O algoritmo termina
quando em um passo no houver necessidade de troca, indicando que o vetor j est ordenado. A
resposta para o problema o valor do contador de trocas. Note que o algoritmo basicamente simula
as ultrapassagens da corrida.
Maratona de Programao da SBC ACM ICPC 2012 17
Problema H
Combate ao cncer
Arquivo: cancer.[c|cpp|java]
Pesquisadores da Fundao Contra o Cncer (FCC) anunciaram uma descoberta revolucionria na
Qumica: eles descobriram como fazer tomos de carbono ligarem-se a qualquer quantidade de outros
tomos de carbono, possibilitando a criao de molculas muito mais complexas do que as formadas
pelo carbono tetravalente. Segundo a FCC, isso permitir o desenvolvimento de novas drogas que
podero ser cruciais no combate ao cncer.
Atualmente, a FCC s consegue sintetizar molculas com ligaes simples entre os tomos de
carbono e que no contm ciclos em suas estruturas: por exemplo, a FCC consegue sintetizar as
molculas (a), (b) e (c) abaixo, mas no a molcula (d).
(a) (b) (c) (d)
Devido agitao trmica, uma mesma molcula pode assumir vrios formatos. Duas molculas so
equivalentes se for possvel mover os tomos de uma das molculas, sem romper nenhuma das ligaes
existentes nem criar novas ligaes qumicas, de forma que ela que exatamente igual outra molcula.
Por exemplo, na gura acima, a molcula (a) no equivalente molcula (b), mas equivalente
molcula (c).
Voc deve escrever um programa que, dadas as estruturas de duas molculas, determina se elas so
equivalentes.
Entrada
A primeira linha de um caso de teste contm um inteiro N indicando o nmero de tomos nas duas
molculas. Os tomos so identicados por nmeros inteiros de 1 a N. Cada uma das 2N 2 linhas
seguintes descreve uma ligao qumica entre dois tomos: as primeiras N 1 linhas descrevem as
ligaes da primeira molcula; as N 1 ltimas descrevem as ligaes qumicas da segunda molcula.
Cada linha contm dois inteiros A e B indicando que existe uma ligao qumica entre os tomos A e
B.
Sada
Para cada caso de teste seu programa deve imprimir uma nica linha, contendo um nico caractere:
S se as molculas so equivalentes ou N caso contrrio.
Restries
2 N 10
4
1 A, B N
Maratona de Programao da SBC ACM ICPC 2012 18
Exemplos
Exemplo de entrada
7
1 2
2 3
3 4
4 5
6 2
7 3
1 2
2 3
3 4
4 5
6 2
7 4
6
1 2
1 3
2 4
2 5
3 6
2 4
5 3
6 4
1 4
5 6
Sada para o exemplo de entrada
N
S
Soluo
Obviamente, duas rvores enraizadas so isomorfas se e somente se existe uma bijeo entre os lhos
de cada raiz de forma que cada par de subrvores correspondente tambm seja isomorfo. Testar todas
as ordens possveis dos lhos para um eventual isomorsmo impraticvel, mas note que o conjunto
das rvores enraizadas enumervel, i.e. podemos atribuir a cada rvore enraizada um nmero inteiro.
0 1 2 3 4 5 6
1394
127 704
1395
74 33 33
Maratona de Programao da SBC ACM ICPC 2012 19
Isso resolve o problema da ordem dos lhos: duas rvores enraizadas so isomorfas se e somente se
ambas as razes tem o mesmo multiconjunto de lhos; essa comparao pode ser feita ordenando as
rvores em ordem crescente de inteiro associado.
A enumerao das rvores no precisa ser feita completamente (isso seria computacionalmente invi-
vel): crie um dicionrio que mapeia multiconjuntos de inteiros a inteiros, representando o identicador
de cada rvore, dados os lhos de sua raiz.
0
0 1
0, 0 2
1 3
0, 0, 0 4
0, 1 5
3 6
0, 0, 0, 0 7

127, 704 1394
33, 33, 74 1395

Se processarmos os vrtices em ordem decrescente de nvel, ao processar um dado vrtice, todos
os seus lhos j tiveram identicadores atribudos a eles; se o multiconjunto dos lhos j existir no
dicionrio, reusamos o identicador; caso contrrio, criamos um novo identicador para aquela rvore.
O que fazer no caso em que a rvore no enraizada? Toda rvore tem no mximo dois vrtices
chamados centros: para ach-los, marque todas as folhas da rvore e depois remova-as; repita o processo
at obter o grafo vazio. Os ltimos vrtices removidos so os centros da rvore (exerccio: por que um
grafo no pode ter mais de dois centros?).
1 3
2 1 3
2 1
1
1 3
2 1
2
1
1 3 1 3
1 2 1
2
Enraizando a primeira rvore em um de seus centros, basta testar se a primeira rvore (agora
enraizada) isomorfa segunda rvore enraizada em algum de seus centros. Como a segunda rvore
tem no mximo dois centros, isso s introduz um fator constante no tempo de execuo do algoritmo.
Maratona de Programao da SBC ACM ICPC 2012 20
Problema I
Integral
Arquivo: integral.[c|cpp|java]
Dado um inteiro positivo n, denotaremos por [n] o intervalo real x : 0 x n. Uma funo
f : [n] ! parcialmente especicada, sendo fornecidos valores de f apenas em pontos de um
subconjunto S de [n].
O conjunto S satisfaz as seguintes propriedades:
1. Os pontos em S so todos inteiros.
2. Os extremos 0 e n de [n] esto ambos em S.
A funo f satisfaz as seguintes propriedades:
1. Os valores de f nos pontos inteiros de [n] so inteiros.
2. Para cada ponto inteiro x em [n] S (ou seja, nos pontos inteiros de [n] que no esto em S),
a funo f montona no intervalo [x 1, x + 1]. Em outras palavras, pelo menos uma das
desigualdades f(x 1) f(x) f(x + 1) ou f(x 1) f(x) f(x + 1) satisfeita.
3. Para cada ponto no inteiro x em [n], o valor de f(x) dado pela interpolao linear de f(x|)
e f(,x|), isto , f(x) = (x x|)f(x|) + (,x| x)f(,x|).
Temos ainda a liberdade de especicar os valores de f nos pontos inteiros de [n] S (note no entanto
que S pode conter todos os pontos inteiros de [n]). Gostaramos de utilizar essa exibilidade para fazer
com que

n
0
f(x)dx = y, isto , a rea sob f(x) entre os extremos 0 e n seja igual a y, um valor dado.
Seu problema ento decidir se isso possvel ou no.
Entrada
A primeira linha de um caso de teste contm trs inteiros, N, M e Y , respectivamente a amplitude
do intervalo, o tamanho do conjunto S e o valor de y. Cada uma das M linhas seguintes descreve a
funo em um ponto de S, contendo dois inteiros X e F, representando f(X) = F. Os valores de X
no esto necessariamente em ordem crescente.
Sada
Para cada caso de teste, determine se existe atribuio de valores a f(x) para os pontos inteiros
x [n] S tal que

n
0
f(x)dx = y, isto , a rea sob f(x) entre os extremos 0 e n seja igual a y.
Em caso negativo, seu programa deve imprimir uma linha contendo apenas o caractere N. Em caso
armativo, seu programa deve imprimir uma linha contendo o caractere S, seguido dos valores de f(x)
para os pontos inteiros x [n] S, em ordem crescente de valores de x. O caractere inicial e os valores
seguintes, se houver, devem ser separados por um espao em branco. Caso mais de uma soluo seja
possvel, imprima aquela que for lexicogracamente menor.
Restries
1 N 10
6
0 X N, X inteiro, X S
Maratona de Programao da SBC ACM ICPC 2012 21
0 F 10
6
, F inteiro
0 Y 10
9
, Y inteiro

n
0
f(x)dx 10
9
para qualquer atribuio de valores a f(x) para x [n] S satisfazendo as
restries do enunciado.
Exemplos
Exemplo de entrada
5 6 10
0 2
1 2
5 2
2 2
3 2
4 2
5 2 10
0 0
5 10
2 2 5
0 1
2 2
10 3 18
0 2
6 4
10 0
2 2 1
0 0
2 1
Sada para o exemplo de entrada
S
S 0 0 0 5
N
S 2 2 2 2 2 1 1 1
N
Soluo
Inicialmente testa-se todas as variveis no seu valor mnimo e no seu valor mximo para vericar
se o valor de y est entre os dois. Em caso armativo, seta-se todas para o valor mximo e, em ordem
lexicogrca, vamos setando o valor das variveis para seu valor mnimo. Quando o valor da integral
car menor que o valor de y, sabe-se que esta varivel a ltima a ser ajustada e escolhe-se o valor
adequado.
Maratona de Programao da SBC ACM ICPC 2012 22
Problema J
Palavras
Arquivo: palavras.[c|cpp|java]
Dados dois conjuntos de palavras formadas por zeros e uns, voc deve escrever um programa para
determinar se existem concatenaes de palavras de cada um dos conjuntos que gerem uma mesma
palavra. Por exemplo, se um conjunto A contm as palavras 010 e 11 e outro conjunto B contm as
palavras 0 e 101, ento a palavra 01011010 pode ser formada tanto por contatenaes de palavras de
A como por contatenaes de palavras de B:
010 11 010 = 01011010 = 0 101 101 0
Entrada
A primeira linha de um caso de teste contm dois inteiros, N
1
e N
2
, que indicam respectivamente o
nmero de palavras do primeiro e do segundo conjunto de palavras. Cada uma das N
1
linhas seguintes
contm uma palavra do primeiro conjunto. Cada uma das N
2
linhas seguintes contm uma palavra do
segundo conjunto.
Sada
Para cada caso de teste seu programa deve imprimir uma nica linha, contendo um nico caractere.
Se for possivel encontrar uma concatenao de uma ou mais palavras do primeiro conjunto que seja
igual a uma concatenao de uma ou mais palavras do segundo conjunto ento o caractere deve ser S,
caso contrrio deve ser N.
Restries
1 N
1
, N
2
20
cada palavra tem no mnimo um caractere e no mximo 40 caracteres, todos zeros e uns.
Maratona de Programao da SBC ACM ICPC 2012 23
Exemplos
Exemplo de entrada
2 2
010
11
0
101
3 1
1
00
000
01
1 1
00
000
Sada para o exemplo de entrada
S
N
S
Soluo
Seja S
1
e S
2
os dois conjuntos dados. Ento, para i = 1, 2, L
i
= S
+
i
, ou seja, L
i
o conjunto
das palavras formadas pelo produto de uma ou mais palavras de S
i
, com possveis repeties. Uma
soluo consiste em construir os dois autmatos nitos, A
1
e A
2
, que reconhecem as linguagens L
1
e L
2
, respectivamente. Em seguida, determina-se se a interseo das linguagens formadas pelos dois
autmatos ou no vazia.
Maratona de Programao da SBC ACM ICPC 2012 24
Problema K
Ciclo de Rubik
Arquivo: rubik.[c|cpp|java]
Provavelmente todos conhecem o Cubo de Rubik, um passatempo 3-D desaador, que tem cada
uma das seis faces cobertas com nove etiquetas, cada etiqueta de uma cor (azul, amarelo, laranja,
branco, verde e vermelho). No estado inicial, todas as nove etiquetas de uma face tm a mesma cor.
Um mecanismo engenhoso permite que cada face seja rotacionada independentemente, fazendo com
que as cores das etiquetas nas faces possam ser misturadas.
Cada uma das faces do Cubo de Rubik denotada por uma letra: F, B, U, D, L, e R, como ilustrado
na gura abaixo.
U
F
D
R
L
B
A rotao de uma face denominada de um movimento. Para descrever os movimentos utilizamos
as letras identicadoras das faces:
uma letra maiscula representa um giro de 90
o
no sentido horrio da face correspondente;
uma letra minscula representa um giro de 90
o
no sentido anti-horrio da face correspondente.
Por exemplo, F representa um giro de 90
o
no sentido horrio da face F; r representa um giro de 90
o
no sentido anti-horrio da face R. Uma sequncia de movimentos denotada por uma sequncia de
letras identicadoras de faces. Assim, rDF representa um giro de 90
o
no sentido anti-horrio da face R,
seguido de um giro de 90
o
no sentido horrio da face D, seguido de um giro de 90
o
no sentido horrio
da face F.
Uma propriedade interessante do Cubo de Rubik que qualquer sequncia de movimentos, se
aplicada repetidas vezes, faz com que o cubo retorne ao estado original (estado que tinha antes da
primeira aplicao da sequncia). Por exemplo, aps quatro aplicaes da sequncia B o cubo retorna
ao estado original.
Voc deve escrever um programa que, dada uma sequncia de movimentos, determine o menor
nmero de aplicaes completas dessa sequncia para que o cubo retorne ao seu estado original.
Entrada
Cada caso de teste descrito em uma nica linha, que contm a sequncia de movimentos.
Sada
Para cada caso de teste seu programa deve imprimir uma nica linha, contendo um nico inteiro,
indicando o menor nmero de aplicaes completas da sequncia para que o cubo retorne ao seu estado
original.
Maratona de Programao da SBC ACM ICPC 2012 25
Restries
Cada sequncia tem no mnimo um movimento e no mximo 80 movimentos.
Exemplos
Exemplo de entrada
Rr
LLL
dl
RUUdBd
Sada para o exemplo de entrada
1
4
105
1260
Soluo
Uma sequncia de movimentos no cubo de Rubik uma permutao dos 9 6 = 54 quadradinhos
coloridos nas faces do cubo (nem todas as permutaes so atingveis, mas isto no importante). O
perodo de uma dessas permutaes o m.m.c. dos ciclos desta permutao.
A maior diculdade deste problema a implementao dos movimentos de cada face cada rotao
altera as posies de 20 dos 54 quadradinhos do cubo!
Maratona de Programao da SBC ACM ICPC 2012 26
Problema L
Estrela
Arquivo: estrela.[c|cpp|java]
Fernando ganhou um compasso de aniversrio, e agora sua diverso favorita desenhar estrelas:
primeiro, ele marca N pontos sobre a circunferncia, dividindo-a em N arcos iguais; depois, ele liga
cada ponto ao k-simo ponto seguinte, at voltar ao ponto inicial.
Dependendo do valor de k, Fernando pode ou no atingir todos os pontos marcados sobre a cir-
cunferncia; quando isto acontece, a estrela chamada de completa. Por exemplo, quando N = 8, as
possveis estrelas so as mostradas no desenho abaixo; as estrelas (a) e (c) so completas, enquanto as
estrelas (b) e (d) no o so.
(a) (b) (c) (d)
Dependendo do valor de N, pode ser possvel desenhar muitas estrelas diferentes; Fernando pediu
que voc escrevesse um programa que, dado N, determina o nmero de estrelas completas que ele pode
desenhar.
Entrada
Cada caso de teste contm de uma nica linha, contendo um nico inteiro N, indicando o nmero
de arcos no qual a circunferncia foi dividida.
Sada
Para cada caso de teste, seu programa deve imprimir uma nica linha contendo um nico inteiro,
indicando o nmero de estrelas completas que podem ser desenhadas.
Restries
3 N < 2
31
Maratona de Programao da SBC ACM ICPC 2012 27
Exemplos
Exemplo de entrada
3
4
5
18
36
360
2147483647
Sada para o exemplo de entrada
1
1
2
3
6
48
1073741823
Soluo
O nmero de estrelas completas igual metade do nmero de inteiros k coprimos com n no
intervalo 0 < k < n.
Dois nmeros a e b so ditos coprimos se no h nenhum divisor em comum a ambos diferente de 1.
Para notar que ser necessrio ver usar coprimos, note que, se voc pegar algum k que no seja coprimo
a n, voc conseguir gerar um ciclo de tamanho
n
k
, em outras palavras, em
n
k
passos, consegue-se chegar
ao ponto 0, onde o prximo ponto seria novamente o k, e, portanto, haveria uma repetio.
Primeiro, fatoramos N = p
e
1
1
p
e
2
2
. . . p
e
r
r
em r fatores primos distintos p
1
, p
2
, . . . , p
r
, onde r 1,
e
1
, e
2
, . . . , e
r
1.
Posteriormente, vamos lembrar alguns conceitos de teoria dos nmeros. Euler j denira uma
funo que, para um nmero n, descreve quantos coprimos menores ou iguais a n existem. Esta funo
denida como (n), tambm conhecida como a funo totiente de Euler. Para acharmos o nmero
de coprimos, temos que lembrar de duas propriedades importantes desta funo:
(p
k
) = p
k1
(p 1) para k 1 e p primo
(a b) = (a) (b), para a e b coprimos
Usando isto, temos ento que (n) = (p
1
1)p
e
1
1
1
(p
2
1)p
e
2
1
2
. . . (p
r
1)p
e
r
1
r
.
Por m, temos que notar que, ao escolher o nmero de coprimos, para metade deles, haver repetio
de estrelas completas distintas. Uma prova direta para isto notar que, para um k coprimo a n, ento
n k tambm ser coprimo a n (numa demonstrao prtica, seria como se voc, ao invs de ter
comeado puxando k para mais, puxasse k para menos, o que daria n k, que seria o ltimo passo da
iterao comeando com k a mais).
Temos, portanto, que a resposta
(n)
2
.

Vous aimerez peut-être aussi