VIII MARATONA DE PROGRAMAÇÃO UERJ – 06/12/2014
Este caderno contém 12 páginas com a descrição de 11 problemas1 definidos
a seguir:
A - DNA
B – Pesagem
C – Vírus
D - Rede sob ataque!
E – Somando
F – Subtraindo
G – Quadratura do retângulo
H – Vetores
I – Burlando a Balança
J - Parênteses e mais parênteses.
K - Homem Primata
1. Resolva os problemas conforme orientação anterior.
2. Não usar nenhum recurso eletrônico extra (pen-drives, tablet, celular)
3. Não utilizar Internet.
4. Permitida a consulta a qualquer material escrito.
5. Tenha muita atenção e calma.
Boa sorte.
1
Autoria de Paulo Eustáquio Duarte Pinto e Fabiano de Souza Oliveira.
1
Problema A
DNA
A Biologia computacional trabalha com a representação do DNA em cadeias de genes e
estuda transformações genéticas que podem ter ocorrido, ao longo dos séculos, nessas
cadeias. Em alguns processamentos os genes são identificados com os números 1 a n e as
cadeias podem ter sofrido transformações que embaralharam esses genes. Dada uma
cadeia contendo n números você deve fazer um programa para indicar se os n genes iniciais,
numerados de 1 a n, estão presentes na cadeia.
Entrada
Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000)
que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste
consiste de duas linhas de entrada. Na primeira linha existe um inteiro n (1 ≤ n ≤ 100),
que indica o número de genes na cadeia. Na segunda linha existem n inteiros positivos
quaisquer indicando o número do gene na cadeia.
Saída
Para cada caso de teste imprima 'S' se a cadeia continua com os n genes iniciais ou 'N',
caso contrário.
Exemplo de entrada
2
10
10 8 6 4 2 1 3 5 7 9
10
10 8 6 4 2 1 3 5 77777 9
Saída para o exemplo de entrada
S
N
2
Problema B
Pesagem
As balanças de dois pratos ainda são encontradas em feiras, em laboratórios especiais e em
museus. Em um dos pratos coloca-se o objeto a ser pesado e, no outro os pesos até
equilibrar a balança. Somam-se os pesos e obtém-se o peso do objeto. Mas também podem
ser colocados alguns pesos junto com o objeto a ser pesado e, nesse caso, tem-se que
subtrair esses pesos da soma dos pesos do lado oposto. Por exemplo, um objeto de peso 15
pode ser pesado colocando-se do outro lado da balança os pesos 8, 4, 2, 1, pois
15 = 8+4+2+1. Mas também pode ser pesado colocando-se o peso 16 do lado oposto e o peso
1 junto com o objeto pois 15 = 16-1.
Neste problema, os pesos são todos as potências de 2 e somente há um peso de cada valor.
Você deve descobrir o esquema que pesa dado objeto de peso inteiro, usando o menor
número de pesos do tipo descrito.
Entrada
A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000) que indica quantos serão os
casos de teste. Cada teste consiste de uma linha contendo um inteiro n (1 ≤ n ≤ 2048) .
Saída
Para cada caso de teste imprima o número mínimo de pesos necessários para pesar o objeto
dado.
Exemplo de entrada
4
1
10
100
1000
Saída para o exemplo de entrada
1
2
3
3
3
Problema C
Vírus
3
5
6
7
1
9
2
4
8
Estamos em um país da África, onde um vírus perigosíssimo acaba de chegar em uma grande
cidade. O país vai ter que tomar medidas extremas para que ele não se propague. A única
saída será bloquear estradas que chegam nas cidades infectadas. Mas o país só tem
dinheiro para bloquear um único trecho de estrada. A Vigilância Sanitária quer descobrir se
existe um trecho de estrada que, quando bloqueado, separa o resto do país da área
infectada. Você vai ajudar, fazendo um programa para identificar se existe um tal trecho
e indicar qual o número máximo de cidades que podem ser isoladas do vírus. Observe que
pode haver mais de um trecho de estrada entre duas cidades.
Entrada
Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000)
que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é
descrito em várias linhas. A primeira contém 3 inteiros: n (1 ≤ n ≤ 1000), o número de
cidades do país, m (n-1 ≤ m ≤ 10000), o número de interligações entre as cidades e
c (1 ≤ c ≤ n), o número da cidade infectada. A seguir vêm m linhas com 2 inteiros indicando
todos os pares de cidades interligadas.
Saída
Para cada caso de teste imprima o número máximo de cidades que podem ser isoladas com o
bloqueio de um trecho de estrada. Se não houver um trecho com as características
procuradas, responda 0.
Exemplo de entrada
2
9 10 3
13
42
34
53
45
65
76
65
87
89
441
12
23
34
14
Saída para o exemplo de entrada
3
0
4
Problema D
Rede sob ataque!
Ataques a servidores importantes numa rede de computadores constituem uma ameaça
constante. As formas de ataque são muitas e, quando uma equipe de Segurança da
Informação detecta um servidor comprometido, desliga-o imediatamente para evitar perda
de informações sigilosas e que uma possível infecção se alastre. A grande desvantagem
desta abordagem é que os servidores são utilizados como pontes (gateways) para troca de
mensagens entre os outros servidores. Assim, quando um servidor sai do ar, ele deixa de
ser um possível intermediário na comunicação entre dois outros servidores. Quando todos
os caminhos de um servidor A a outro B possuem como servidor intermediário um certo nó
C, dizemos que C é um ponto de vulnerabilidade da rede.
Sua missão é escrever um programa que ajude no estudo de uma rede, detectando seus
pontos de vulnerabilidade. A intenção é usar este estudo como base para uma avaliação de
quão robusta é uma rede (quanto menos pontos de vulnerabilidade, mais robusta é
considerada a rede)..
Entrada
Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 1000) que
indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é
descrito em várias linhas. A primeira contém 2 inteiros: n (1 ≤ n ≤ 1000) representando o
número de servidores na rede, e m (n-1 ≤ m ≤ 1000000), o número de interligações entre
pares de servidores por onde uma mensagem pode transitar, Em seguida, há m linhas com 2
inteiros indicando todos os pares de servidores interligadas.
Saída
Para cada caso de teste imprima o número de pontos de vulnerabilidades encontrados.
Exemplo de entrada
3
32
12
23
44
12
23
34
14
13 14
12
23
34
37
45
57
56
78
89
8 10
8 11
11 12
12 13
11 13
Exemplo de saída
1
0
6
5
Problema E
Somando
Um problema clássico é o de determinar todos os subconjuntos cuja soma é determinado
valor, dado um conjunto de inteiros positivos. Agora você tem que calcular algo mais
simples. Dado um conjunto de n numeros inteiros e um valor s, você deve apenas calcular
quantos subconjuntos têm a soma de seus elementos igual ou superior a s.
Entrada
Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 1000)
que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é
descrito em duas linhas. A primeira contém dois inteiros n (1 ≤ n ≤ 100), o número de
elementos do conjunto e s (1 ≤ s ≤ 100), o valor mínimo que a soma dos elementos dos
subconjuntos procurados deve ter. Na segunda linha vêm n inteiros ordenados de forma não
decrescente, todos entre 1 e 1000.
Saída
Para cada caso de teste imprima o número de subconjuntos cuja soma é igual ou superior a
s.
Exemplo de entrada
3
40 2
2222222222222222222222222222222222222222
56
22222
10 100
1 3 5 7 9 11 13 15 17 19
Saída para o exemplo de entrada
1099511627775
16
1
6
Problema F
Subtraindo
Cinco amigos de várias idades se encontram para almoçar e começam a especular qual seria
a maior diferença de idade entre dois amigos no grupo. Você é um dos amigos e pode
calcular isso, pois quem disser mais rápido esse valor não pagará a conta do restaurante.
Faça rápido um programa para obter o resultado.
Entrada
Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000)
que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é
descrito em uma linha com 5 inteiros, as idades dos amigos.
Saída
Para cada caso de teste imprima a diferença máxima de idade entre dois amigos do grupo.
EXEMPLO DE ENTRADA
3
18 10 9 60 44
21 21 21 21 21
19 21 18 19 20
EXEMPLO DE SAÍDA
51
0
3
7
Problema G
Quadratura do retângulo
a+b
a
b
No século XX muitos matemáticos trataram da decomposição de retângulos e quadrados em
quadrados distintos e, surpreendentemente, a solução para esse problema encontra
aplicações em circuitos elétricos. Neste problema, você vai trabalhar com uma partição em
quadrados especial definida na figura acima. Em tal partição, o menor quadrado tem lado a
(número inteiro), o segundo menor tem lado b (número inteiro) e os lados dos demais
quadrados podem ser inferidos a partir da soma dos lados de algum subconjunto de
quadrados menores, conforme a figura. Você vai fazer um programa no qual, dados a e b,
deve-se calcular o perímetro do retângulo correspondente, caso seja possível construí-lo,
Entrada
Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000)
que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é
descrito em uma linha, contendo dois inteiros a e b, representados em 32 bits, indicando,
respectivamente, o lado do menor e do segundo menor quadrados da partição.
Saída
Para cada caso de teste imprima um valor inteiro representando o perímetro do retângulo,
se ele puder ser construído ou 0, caso contrário.
Exemplo de entrada
2
4 10
10 4
Saída para o exemplo de entrada
520
0
8
Problema H
Vetores
Vetores são ferramentas matemáticas muito úteis e tornam muitos cálculos bem fáceis.
Vetores de duas dimensões podem ser desenhados no plano. Para desenhar o vetor (3, 4)
toma-se o retângulo de dimensões 3 x 4 e o vetor é a diagonal desse retângulo que começa
na posição (0, 0) e termia na posição (3, 4). Vetores podem ser justapostos deslocando-se o
começo de um deles para o final do outro. Dessa forma, podemos ter uma área
compreendida pelos vetores justapostos e o eixo x. A figura mostra a justaposição de três
vetores: (3, 4), (4, 0), (8, 4), gerando uma área de 6+16+48 = 70. Observe que se
tivéssemos trocado a ordem da justaposição dos dois últimos vetores, teríamos obtido uma
área de 6+48+32=86.
Neste problema você vai receber uma série de vetores e determinar qual a maior área que
pode ser formada pela justaposição dos mesmos.
Entrada
Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000)
que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é
descrito em duas linhas. Na primeira vem o número n de vetores (1 ≤ n ≤ 1000). Na segunda
linha vêm 2n pares de inteiros positivos, representando as dimensões x e y de cada vetor.
Essas dimensões variam de 0 a 1000.
Saída
Para cada caso imprimir uma linha contendo um valor real, com uma decimal, indicando a
área máxima que pode ser conseguida justapondo-se convenientemente os vetores.
Exemplo de Entrada
2
3
34 40 8 4
2
1133
Exemplo de Saída
86.0
8.0
9
Problema I
Burlando a Balança
Algumas crianças de uma escola
descobriram que se pesassem em
uma máquina de pesagem aos pares,
e depois trocassem de lugares - um
de cada vez , poderiam obter o
peso correto de todos, pagando apenas uma vez.
O grupo tinha 5 crianças e eles obtiveram as seguintes pesagens: 101, 102, 103, 103, 104,
104, 105, 105, 106, 107. Os pesos de cada um eram 50, 51, 52 , 53, 54. Como pesar dessa
forma e achar o peso de cada criança separadamente?
Dada um valor n e as pesagens de todos os pares de crianças do grupo, determinar o pesos
de cada criança, sabendo-se que esse peso varia entre 40 e 70.
Entrada
Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 10000)
que indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste
contém duas linhas. A primeira linha contém o número n de crianças (3 ≤ n ≤ 100). Na
segunda linha vêm n(n-1)/2 inteiros ordenados, representando os pesos de todos os pares
distintos de crianças. Cada valor varia entre 80 e 140.
Saída
Para cada caso de teste imprima, ordenadamente, os pesos de cada uma das n crianças.
Exemplo de entrada
3
5
80 80 80 80 80 80 80 80 80 80
4
101 102 103 103 104 105
5
101 103 104 107 108 110 112 113 115 119
Saída para o exemplo de entrada
40 40 40 40 40
50 51 52 53
50 51 53 57 62
10
Problema J
Parênteses e mais parênteses...
Em Matemática, a avaliação de expressões envolvendo múltiplos operadores requer a definição
da precedência de aplicação de tais operadores. Por exemplo, é definido o padrão de que numa
expressão algébrica, multiplicações e divisões vêm antes de adições e subtrações, de modo que
3 + 4 x 5 é igual a 23. Mas quando a precedência dos operadores deve ser outra daquela
definida por convenção, o uso dos parênteses se torna necessário, de modo que (3 + 4) x 5
resulta em 35.
Embora a ordem de precedência de operadores de qualquer expressão possa ser totalmente
definida por parênteses, é comum utilizar outros tipos de parênteses para facilitar a leitura,
como as chaves e os colchetes. O problema da avaliação da expressão parentizada bem formada
é aquele de decidir se, dada uma expressão parentizada, se a todo parêntese aberto de um
determinado tipo correspondente unicamente um parêntese fechado de mesmo tipo (e viceversa) e que a sub-expressão entre tal par de abre-e-fecha parênteses é uma expressão
parentizada bem formada.
Neste problema, você deve verificar se uma expressão parentizada, que pode envolver um
número arbitrário de tipos de parênteses, está bem formada. Por simplicidade, apenas os
parênteses são informados na expressão, omitindo-se quaisquer outros elementos. Uma
expressão parentizada é dada por uma sequência de duplas X Y, onde X denota se corresponde
a um abre-parêntese (quando X = A), ou a um fecha-parêntese (quando X = F) e o tipo
do parêntese sendo aberto ou fechado é dado por um valor numérico, valor de Y. Assim, a
dupla A 2 significa que um parêntese do tipo 2 está sendo aberto na expressão, enquanto
a dupla F 3 representa que um parêntese do tipo 3 está sendo fechado na expressão.
Seu trabalho é escrever um programa que determine se expressões que só possuam parênteses,
e codificados como acima, são bem formadas ou não.
Entrada
Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 200) que
indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é descrito
em duas linhas. A primeira inicia um inteiro n (1 ≤ n ≤ 100000) representando o número
de parênteses contidos na expressão. Na segunda linha, há n duplas X Y separadas por espaço,
onde X é igual a A (abertura) ou F (fechamento) e Y (1 ≤ n ≤ 100000) representa o tipo
de parêntese sendo aberto ou fechado.
Saída
Para cada caso de teste, imprima S se a expressão parentizada é bem-formada ou N no caso
contrário.
Exemplo de entrada
4
4
A1A2F2F1
4
A1A2F1F2
16
A1A2A3F3A3A3F3A4F4F3A1F1F2A3F3F1
16
A1A2A3F3A3A3F3A4F4F3A1F1F2A3F1F3
Exemplo de saída
S
N
S
N
11
Problema K
Homem Primata
A Teoria Evolucionista consiste da hipótese de que as diversas espécimes de vida,
caracterizadas pela sua estrutura de DNA, foram geradas a partir de mutações de
estruturas de DNA de outras formas de vida com o passar do tempo. Os seres mutantes
que eram adaptados às condições de vida sobreviveram e se reproduziram, estabelecendo,
assim, uma nova espécime de seres vivos.
Um grupo de cientistas evolucionistas de um reconhecido centro de pesquisas conjecturam
que a probabilidade de uma espécime A derivar diretamente de uma espécime B possui
relação com o número mínimo necessário de mutações para se transformar uma cadeia de
DNA de A numa daquela de B. Quanto menor tal número, mais chances há de uma derivação
direta. Você foi contratado por este centro de pesquisas para auxiliá-los neste projeto.
Os quatro subtipos de nucleotídeos são simbolizados por T, A, G e C. Uma cadeia de DNA é
caracterizada, de forma simplificada, por uma sequência de nucleotídeos. Uma mutação em
uma cadeia de DNA consiste de um dentre os seguintes acontecimentos: (i) a aparição de
um nucleotídeo em uma posição arbitrária da cadeia; (ii) a mudança de um nucleotídeo numa
posição arbitrária da cadeia por outro; ou (iii) o desaparecimento de um nucleotídeo numa
posição arbitrária da cadeia.
Sua tarefa é escrever um programa de computador para determinar, dadas duas cadeias de
DNAs A e B, o número mínimo de mutações para que A se transforme em B.
Entrada
Haverá vários casos de teste. A primeira linha da entrada é um inteiro t (1 ≤ t ≤ 1000) que
indica quantos serão os casos de teste. A seguir são descritos t testes. Cada teste é
descrito em duas linhas. Cada linha contém um string representando uma das cadeias de
DNA. Cada cadeia tem de 1 a 1000 nucleotídeos.
Saída
Para cada caso de teste, imprima o número de mínimo de mutações para se transformar a
primeira cadeia na segunda..
Exemplo de entrada
2
CTC
ATCG
ACTG
AAG
Saída para o exemplo de entrada
2
2
12
Download

Problema