Caderno de Tarefas – Nível 2

Propaganda
1
VI Olimpíada de Programação – Junho/2011
Regras de Funcionamento – Nível 2
1. As questões serão anunciadas no início da Olimpíada, às 08h30min. Os participantes terão 3
horas para apresentar soluções, na forma de implementação desenvolvida em qualquer dos
compiladores previstos: C++ DEV-C++, C DEV-C++, C++ Visual C++, JAVA, GCC e G++.
2. A prova deverá ser resolvida individualmente.
3. Os trabalhos serão avaliados por um júri formado por professores do INATEL.
4. Quando um participante julgar que tem um programa que resolve um problema, deverá
submetê-lo à correção dos juízes, que compilarão e executarão o mesmo para uma bateria de
testes desconhecida dos participantes. Um problema será considerado resolvido se, para
todos os testes da bateria, devolver o resultado esperado pelos juízes. Para cada submissão
o participante receberá uma resposta, que poderá ser satisfatória (e o problema está
resolvido) ou indicará algum erro: resposta errada, tempo de execução excedido, erro de
execução, erro de compilação, etc.
5. Será considerado vencedor aquele que resolver a maior quantidade de problemas nas 3
horas de competição. Empates no número de problemas resolvidos serão classificados pelo
tempo corrigido. Ganhará aquele que tiver o menor tempo corrigido. O tempo corrigido será
dado pela soma dos tempos corrigidos somente dos problemas corretamente resolvidos pelo
participante. O tempo corrigido de um problema será dado pelo número de minutos
decorridos desde o início da competição até o momento da submissão correta somado a uma
penalidade de 20 minutos por submissão incorreta feita anteriormente neste problema. Em
caso de empate, será considerado vencedor o participante que tiver a primeira submissão
correta. Persistindo o empate, a organização fará um sorteio entre os participantes
envolvidos.
6. A organização da competição será responsável pela decisão de qualquer caso não previsto.
7. Material permitido para consulta: qualquer material impresso (livros, apostilas, códigos
impressos, etc.), e a ajuda (help) do sistema.
8. Não será permitido o uso da internet nem de qualquer dispositivo de armazenamento
eletrônico de dados (disquetes, pendrives, etc.).
9. Os participantes inscritos permitirão o uso e divulgação dos programas submetidos pela
organização da competição.
10. Para fins de validação de AC (Atividades Complementares), o participante deverá submeter
pelo menos uma solução correta.
2
VI Olimpíada de Programação – Junho/2011
A - Contador de Dígitos
Arquivo fonte: digito.c, digito.cpp ou digito.java
Diana irá escrever uma lista com todos os inteiros positivos entre A e B, inclusive, sem zeros à
esquerda.
Ela quer saber quantas vezes cada dígito será utilizado.
Entrada
Cada caso de teste terá uma única linha contendo dois inteiros A e B (1  A  B  108). O último caso
de teste é seguido de uma linha contendo dois zeros.
Saída
Para cada caso de teste escreva uma única linha na saída com 10 inteiros representando o número de
vezes que cada dígito é utilizado. Escreva a quantidade para cada dígito em ordem crescente de 0 a 9.
Exemplos
Entrada de entrada:
19
12 321
5987 6123
12345678 12345679
00
Saída para o exemplo de entrada:
0111111111
61 169 163 83 61 61 61 61 61 61
134 58 28 24 23 36 147 24 27 47
0222222211
3
VI Olimpíada de Programação – Junho/2011
B - Homens das Cavernas
Arquivo fonte: cavernas.c, cavernas.cpp ou cavernas.java
Java é um valente homem das cavernas. Toda semana Java sai para caçar, porém ultimamente tem
ficado muito incomodado, pois acha que têm trago menos animal. Vendo sua inquietação, sua filha
Lua deu a ideia de registrar a cada caça o número de animais capturados. Porém para fazer isto eles
precisam de sua ajuda, já que cada um só consegue contar até cinco utilizando uma de suas mãos.
Entrada
A entrada é composta de vários casos de teste. Cada caso de teste possui uma única linha contendo
dois inteiros J e L (0 ≤ J,L ≤ 5) representando a contagem feita por Java e a feita por Lua
respectivamente.
A entrada termina quando J e L são iguais a 0.
Saída
Para cada caso de teste seu programa deve imprimir uma linha com a soma dos animais contados por
Java e Lua.
Exemplos
Exemplo de entrada:
05
11
30
25
00
Saída para o exemplo de entrada:
5
2
3
7
4
VI Olimpíada de Programação – Junho/2011
C - Sapateiro
Arquivo fonte: sapateiro.c, sapateiro.cpp ou sapateiro.java
O sapateiro Zé tem N reparos a serem feitos. Zé só pode trabalhar em um reparo por dia. Cada reparo
i tem um inteiro Ti (1 ≤ Ti ≤ 1000), que representa o número de dias necessários para ser finalizado.
Para cada dia de delay antes de começar o i-ésimo reparo, Zé deve pagar uma multa de
Si (1 ≤ Si ≤ 10000) centavos. Sua tarefa é ajudar o Zé, escrevendo um programa que encontre a
sequência de reparos com o mínimo total de multas.
Entrada
A entrada começa com um inteiro positivo indicando o número de casos de teste. A primeira linha de
cada caso de teste contém um inteiro N (1 ≤ N ≤ 1000) que representa o número de reparos. As
próximas N linhas contém cada uma dois inteiros: o tempo e a multa de cada reparo.
Saída
Seu programa deve imprimir a sequência de reparos com o total mínimo de multas. Cada reparo deve
ser representado pelo número que representa sua ordem de entrada, ou seja, o primeiro pelo número 1,
o segundo pelo 2, e assim por diante até o reparo N. A sequência deve ser escrita em apenas uma linha
com os números dos reparos separados por um único espaço. Se mais de uma solução é possível,
imprima a que aparece primeiro em ordem lexicográfica.
Após cada sequência você deve deixar uma linha em branco.
Obs: Ordem lexicográfica: X1 ≤ X2 ≤ X3... XN
Exemplos
Exemplo de entrada:
2
4
34
1 1000
22
55
5
89
11 9
12 19
89
12 19
Saída para o exemplo de entrada:
2134
<linha em branco>
35142
<linha em branco>
5
VI Olimpíada de Programação – Junho/2011
D - Super Mario
Arquivo fonte: mario.c, mario.cpp ou mario.java
Mario está no ultimo castelo. Agora só precisa pular sobre algumas paredes para entrar na câmara do
Koopa, onde terá que derrotá-lo para salvar a princesa. Para este problema, estamos apenas
preocupados com a parte de pular os muros.
Serão fornecidas as alturas de N paredes da esquerda para a direita. Mario está atualmente na primeira
parede. Ele precisa pular para as paredes adjacentes uma após a outra até chegar à última, ou seja,
dará (N-1) pulos. Um pulo alto é quando Mario tem que pular para uma parede mais alta, e
similarmente, um pulo baixo é quando Mario precisa pular para uma parede mais baixa.
Você é capaz de descobrir o número total de pulos altos e pulos baixos que Mario dará.
Entrada
A primeira linha da entrada é um inteiro T (T < 30) que indica o número de casos de testes. Cada caso
de testes começa com um inteiro N (0 < N < 50) que determina o número de paredes. A próxima linha
contém a altura das N paredes, da esquerda para a direita. Cada altura é um inteiro positivo menor ou
igual a 10.
Saída
Para cada caso de teste, escreva o número do teste seguido de dois inteiros: o total de pulos altos e o
total de pulos baixos, respectivamente. Olhe o exemplo de saída para o formato exato.
Exemplos
Exemplo de entrada:
3
8
14223534
1
9
5
12345
Saída para o exemplo de entrada:
Caso 1: 4 2
Caso 2: 0 0
Caso 3: 4 0
6
VI Olimpíada de Programação – Junho/2011
E - Pangram
Arquivo fonte: pangram.c, pangram.cpp ou pangram.java
“Pangram Show” é um novo programa de TV que oferece bons prêmios para quem detectar
corretamente se uma sentença é um pangram. Um pangram é uma sentença que contém pelo menos
uma das 26 letras do alfabeto inglês. São exemplos de pangram:
 the quick brown fox jumps over a lazy dog
 jackdaws loves my big sphinx of quartz
Cada competidor precisa indicar se cada sentença é um pangram ou não.
Sua tarefa é escrever um programa para facilitar este trabalho.
Entrada
A entrada é composta por vários casos de teste. Cada caso de teste é dado em uma única linha que
contém uma string não nula de no máximo 200 caracteres. As palavras das sentenças são separadas
por um único espaço. Apenas letras minúsculas do alfabeto inglês e espaços aparecem em cada linha
da entrada.
O último caso de teste é seguido de uma linha que contém um único asterisco.
Saída
Para cada caso de teste seu programa deve escrever uma única linha contendo um ‘Y’ se a sentença é
um pangram ou um ‘N’ caso contrário.
Exemplos
Exemplo de entrada:
jackdawf loves my big quartz sphinx
abcdefghijklmnopqrstuvwxyz
hello world
*
Saída para o exemplo de entrada:
Y
Y
N
7
VI Olimpíada de Programação – Junho/2011
F - Irmãos
Arquivo fonte: irmaos.c, irmaos.cpp ou irmaos.java
O reino de ACM era comandado por um grande Rei que era obcecado por ordem. O reino tinha forma
retangular, e o rei dividiu o território em uma grade de pequenos países retangulares. Antes de morrer,
o Rei distribuiu os países entre seus filhos.
No entanto, ele não sabe que seus filhos desenvolveram uma estranha rivalidade; o primeiro herdeiro
odiava o segundo herdeiro, mas não os demais; o segundo herdeiro odiava o terceiro herdeiro, mas
não os demais, e assim por diante. Finalmente, o último herdeiro odiava o primeiro herdeiro, mas não
os demais.
Logo que o Rei morreu, essa estranha rivalidade entre os filhos do Rei desencadeou uma guerra
generalizada no reino. Os ataques ocorriam apenas entre pares de países adjacentes (que
compartilham uma borda vertical ou horizontal). Um país X atacava um país adjacente Y sempre que
o proprietário de X odiava o proprietário de Y. O país atacado era sempre conquistado pelo irmão
atacante. Por uma questão de honra, todos os ataques aconteciam simultaneamente, e um conjunto de
ataques simultâneos recebia o nome de batalha. Após certo número de batalhas, os filhos
sobreviventes assinaram um tratado de trégua e nunca mais batalharam.
Por exemplo, se o Rei tinha três filhos (0, 1 e 2) a figura abaixo mostra o que acontece na primeira
batalha dada uma distribuição inicial das terras:
Você foi contratado para ajudar um historiador da ACM a determinar, dados o número de herdeiros, a
distribuição inicial de territórios e o número de batalhas, qual a distribuição final de territórios após as
batalhas.
Entrada
A entrada contém vários casos de teste. A primeira linha de um caso de teste contém quatro inteiros
N, R, C e K separados por um espaço em branco. N é o número de herdeiros (2 ≤ N ≤ 100), R e C são
as dimensões do reino (2 ≤ R,C ≤ 100) e K é o número de batalhas (1 ≤ K ≤ 100). Herdeiros são
identificados por inteiros de 0 até N-1. Cada uma das seguintes R linhas contém C inteiros Hr,c
separados por um espaço em branco, representando a distribuição inicial de terras: Hr,c é o proprietário
inicial do país na linha r e coluna c (0 ≤ Hr,c ≤ N-1).
O último caso de teste é seguido de uma linha contendo quatro zeros separados por um espaço em
branco.
Saída
Para cada caso de teste, seu programa deve imprimir R linhas com C inteiros cada, separados por um
espaço em branco, no mesmo formato da entrada, representando a distribuição das terras após todas as
batalhas.
8
VI Olimpíada de Programação – Junho/2011
Exemplos
Exemplo de entrada:
3443
0120
1020
0120
0122
4234
103
212
8421
07
16
25
34
0000
Saída para o exemplo de entrada:
2220
2101
2220
0200
103
212
76
05
14
23
9
VI Olimpíada de Programação – Junho/2011
G - O Cachorro e a Toupeira
Arquivo fonte: cachorro.c, cachorro.cpp ou cachorro.java
Em um campo grande há um cachorro e uma toupeira. O cachorro quer comer a toupeira, enquanto a
toupeira quer correr com segurança através de um dos vários buracos cavados na superfície do campo.
Nem o cachorro e nem a toupeira são mestres da matemática, porém, nenhum é totalmente estúpido.
A toupeira escolhe um buraco e corre em linha reta a uma velocidade fixa. O cachorro, que é muito
bom em linguagem corporal, antecipa qual o buraco escolhido pela toupeira e corre com o dobro da
velocidade da toupeira para o buraco, onde pretende pega-la. Se o cachorro chegar primeiro a toupeira
será capturada, caso contrário conseguirá escapar.
Você deve selecionar um buraco para a toupeira escapar, se tal buraco existir.
Entrada
A entrada é composta por vários casos de teste. A primeira linha de cada caso de teste contém um
inteiro N que representa o número de buracos. A segunda linha contém quatro números reais que
representam as coordenadas (x,y) da toupeira seguidas das coordenadas (x,y) do cachorro. As
próximas N linhas contém cada uma dois números reais representando as coordenadas (x,y) de um
buraco. A entrada termina quando N = 0.
Saída
Seu programa deve escrever uma única linha para cada caso de teste. Se a toupeira consegue escapar a
saída deve ser: “A toupeira pode escapar pelo buraco (x,y).” sem aspas. Se existir mais de um buraco
em que a toupeira possa escapar seu programa deve apresentar o que primeiro apareceu na entrada.
Caso não haja como escapar a saída deve ser: “A toupeira nao pode escapar.” sem aspas e sem acento
no ‘nao’. Não há mais do que 1000 buracos em cada teste e as coordenadas estão entre -10000 e
+10000.
Exemplos
Exemplo de entrada:
1
1.000 1.000 2.000 2.000
1.500 1.500
2
2.000 2.000 1.000 1.000
1.500 1.500
2.500 2.500
0
Saída para o exemplo de entrada:
A toupeira nao pode escapar.
A toupeira pode escapar pelo buraco (2.500,2.500).
1
0
VI Olimpíada de Programação – Junho/2011
H - Reciclagem
Arquivo fonte: reciclagem.c, reciclagem.cpp ou reciclagem.java
Reciclar vidros requer que os vidros sejam separados pela cor em uma das três categorias: marrons,
verdes e brancos (claros). Neste problema você receberá três sacos recicláveis, cada um contendo um
número específico de garrafas marrons, verdes e brancas. Para que sejam recicladas, as garrafas
precisarão ser movidas de forma que cada saco contenha garrafas de apenas uma cor.
O problema é minimizar o número de garrafas a serem movidas. Você pode considerar que os sacos
são enormes, de modo que não têm limite de quantidade. O número total de garrafas nunca irá exceder
231.
Entrada
A entrada é composta por vários casos de testes. Cada caso de teste contém uma única linha com nove
inteiros. Os primeiros três inteiros representam o número de garrafas marrons, verdes e brancas
(respectivamente) no saco número 1, os três números seguintes representam o número de garrafas
marrons, verdes e brancas no saco número 2, e os últimos três números representam o número de
garrafas marrons, verdes e brancas no saco número 3. Por exemplo, a linha 10 15 20 30 12 8 15 8 31
indica que há 10 garrafas marrons no saco 1, 12 garrafas verdes no saco 2, e 31 garrafas brancas no
saco 3.
O último caso de teste é seguido por uma linha com 9 zeros.
Saída
Para cada caso de teste seu programa deve imprimir uma linha indicando as cores de garrafas de cada
saco e o número mínimo de movimentos. Por questões de internacionalização você deve escrever as
iniciais de cada cor em inglês: ‘G’ para garrafas verdes (green), ‘B’ para garrafas marrons (brown) e
‘C’ para garrafas brancas (clear). A linha de resposta deve ser no formato: XYZ M, onde X é a letra
inicial da cor das garrafas do primeiro saco, Y do segundo saco e Z do terceiro. O X é um inteiro
representando o número mínimo de movimentos.
Se mais de uma ordem de cores possuem o número mínimo de movimentos, então a que vier primeiro
em ordem alfabética deve ser utilizada.
Exemplos
Exemplo de entrada:
123456789
5 10 5 20 10 5 10 20 10
000000000
Saída para o exemplo de entrada:
BCG 30
CBG 50
Download