0% found this document useful (0 votes)
667 views218 pages

Spojbr Obi PDF

Uploaded by

seib
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
667 views218 pages

Spojbr Obi PDF

Uploaded by

seib
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 218

 

Archives of the SPOJ Brasil


obi problemset
 

Editors:
Wanderley Guimarăes

Last updated: 2012-12-14 09:16:56

1
Preface
This electronic material contains a set of algorithmic problems, forming the archives of the SPOJ
Brasil (http://www.spoj.com/SPOJBR/), obi problemset. The document can be accessed at the
following URLs:

in PostScript format: http://www.spoj.com/SPOJBR/problems/obi.ps


in Portable Document Format: http://www.spoj.com/SPOJBR/problems/obi.pdf

These resources are constantly updated to synchronise with the ever-changing hypertext version of the
problems, and to include newly added problems. If you have obtained this document from another
source, it is strongly recommended that you should download the current version from one of the
aforementioned URLs.

Enjoy problem-solving at the SPOJ Brasil!

Disclaimer from the Editors. Despite our best efforts, it is possible that this document contains errors or that some of the
content differs slightly from its original hypertext form. We take no responsibility for any such faults and their
consequences. We neither authorise nor approve use of this material for any purpose other than facilitating problem solving
at the Sphere Online Judge site; nor do we guarantee its fitness for any purpose whatsoever.

The layout of the problems in this document is the copyright of the Editors named on the cover (as determined by the
appropriate footers in the problem description). The content is the copyright of the respective Editor unless the copyright
holder is otherwise stated in the ’resource’ section. The document as a whole is not protected by copyright, and fragments
of it are to be regarded independently. No responsibility is taken by the Editors if use or redistribution of this document
violates either their or third party copyright laws. When referring to or citing the whole or a fragment of this document,
please state clearly the aforementioned URLs at which the document is to be found, as well as the resources from which the
problems you are referring to originally came.

Remarks concerning this document should be sent to the following e-mail address: [email protected].

2
Table of Contents
1. Problem REDOTICA (810. Rede ótica)
2. Problem QUERM (811. Quermesse)
3. Problem BIT (812. Bits Trocados)
4. Problem SALDO (813. Saldo de gols)
5. Problem MACACO (814. Macaco-prego)
6. Problem LUA (815. Temperatura Lunar)
7. Problem TESOURO (816. Caça ao Tesouro)
8. Problem DOBRA (817. Dobradura)
9. Problem AERO (818. Aeroporto)
10. Problem PEDAGIO (819. Pedágio)
11. Problem COFRE (840. Cofrinhos da Vó Vitória)
12. Problem ESTAGIO (841. Estágio)
13. Problem OBIHANOI (842. Torres de Hanói)
14. Problem SUPERMER (843. Supermercado)
15. Problem NUMERDOS (844. Número de Erdos)
16. Problem OBITETRI (845. Tetris)
17. Problem METEORO (1330. Meteoros)
18. Problem OBIDOMIN (1331. Dominó)
19. Problem DENGUE (1332. Dengue)
20. Problem SORVETE (1333. Sorvete)
21. Problem CALCULA (1334. Calculando)
22. Problem PAR (1363. Par ou ímpar)
23. Problem FUROS (1364. Cubra os furos)
24. Problem PAL (1365. Palíndrome)
25. Problem TV (1366. TV da Vovó)
26. Problem SENHA (1367. Proteja sua senha)
27. Problem ORKUT (1368. Orkut)
28. Problem BAFO (1386. Bafo)
29. Problem ENERGIA (1387. Transmissao de Energia)
30. Problem VIVO (1388. Vivo ou Morto)
31. Problem DESCULPA (1389. Pedido de Desculpas)
32. Problem OBIPOKER (1390. Mini-Poker)
33. Problem FROTATAX (2606. Frota de Táxi)
34. Problem MINHOCA (2607. Campo de Minhocas)
35. Problem DUENDE (2608. Duende Perdido)
36. Problem TRILHAS (2609. Trilhas)
37. Problem ELEICOES (3773. Eleiçoes)
38. Problem FATORIA2 (3774. Fatorial)
39. Problem FLIPERAM (3775. Fliperama)
40. Problem GENEAL (3776. Árvore Genealógica)
41. Problem MIOJO (3826. Miojo)
42. Problem PARPROX (3827. Pontos)
43. Problem PRIMO (3828. Primo)
44. Problem QUADRAD2 (3829. Quadrados)
45. Problem SOMA (3830. Soma)

3
46. Problem JSEDEX (8696. Sedex)
47. Problem JPNEU (8697. Pneu)
48. Problem JGARCOM (8698. Garçom)
49. Problem JDENTIST (8699. Dentista)
50. Problem JESCADA (8700. Escada)
51. Problem JTACOGRA (8701. Tacógrafo)
52. Problem CONTA1 (8703. Conta de água)
53. Problem COPA1 (8704. Copa do mundo)
54. Problem PEDAGIO1 (8705. Pedágio)
55. Problem TIMES1 (8706. Times)
56. Problem CHAMADA1 (8707. Chamada)
57. Problem DANCA1 (8708. Dança)
58. Problem FUSOES1 (8709. Fusoes)
59. Problem MARCIAN1 (8710. Marciano)
60. Problem BATALHA2 (8776. Batalha naval)
61. Problem COMETA2 (8777. Cometa)
62. Problem ELEVADO2 (8778. Elevador)
63. Problem REUNIAO2 (8779. Reuniao)
64. Problem ALTAS2 (8780. Altas aventuras)
65. Problem FLOREST2 (8781. Floresta)
66. Problem MATRIZ2 (8782. Matrizes)
67. Problem TELESCO2 (8783. Telescópio)
68. Problem TRADUTO2 (8784. Tradutor alienígena)
69. Problem MINADO12 (10864. Campo minado)
70. Problem CORRID11 (10865. Corrida)
71. Problem TRANSP11 (10866. Transporte)
72. Problem CALCUL11 (10867. Calculadora)
73. Problem CHUVA11 (10868. Chuva)
74. Problem GINCAN11 (10869. Gincana)
75. Problem CORR11 (11001. Corrida)
76. Problem PAS11 (11002. Progressoes aritméticas)
77. Problem PUSAPO11 (11003. Pulo do sapo)
78. Problem TRIANG11 (11004. Triângulos)
79. Problem CALCU11 (11005. Calculadora)
80. Problem COLOR11 (11006. Colorindo)
81. Problem BALE11 (11007. Balé)
82. Problem SELOS11 (11008. Selos)
83. Problem PESCA11 (11009. O mar nao está para peixe)
84. Problem TESOUR11 (11010. Caça ao tesouro)
85. Problem CARTOG11 (11011. Desafio cartográfico)
86. Problem QUADRA11 (11012. Quadrado aritmético)
87. Problem MAGICO11 (11013. Quadrado mágico)
88. Problem EXPRES11 (11014. Expressoes)
89. Problem ESCALO11 (11015. Escalonamento ótimo)
90. Problem RMAPA11 (11016. Reduzindo detalhes em um mapa)
91. Problem VIRA11 (11017. Vira!)
92. Problem BACT09 (11628. Bactérias)

4
93. Problem CHOCPJ09 (11629. Competiçăo de chocolate)
94. Problem CHOC09 (11630. Competiçăo de chocolate)
95. Problem ENVEL09 (11631. Número de Envelopes)
96. Problem FUGIT09 (11636. O fugitivo)
97. Problem MARAT09 (11638. Maratona)
98. Problem MITO09 (11641. Caçadores de Mitos)
99. Problem NOTA09 (11645. Notas da prova)
100. Problem OLIMP09 (11646. Olimpíadas)
101. Problem OVERF09 (11647. Overflow)
102. Problem PAPEL09 (11648. Avioes de papel)
103. Problem PONTES09 (11649. Caminho das pontes)
104. Problem SIMUL09 (11650. Simulador)
105. Problem BANDA09 (11651. Banda)
106. Problem CADEIR09 (11654. Cadeiras do auditório)
107. Problem OLIMPJ09 (11675. Olimpíadas)
108. Problem LAB07 (12928. Labirinto)
109. Problem PIZZA07 (12930. Pizza)
110. Problem PENAL06 (12937. Penalidade mínima)
111. Problem PAO07 (12939. Păo a metro)
112. Problem AUTO08 (12993. Auto Estrada)
113. Problem VIAESP08 (12994. Viagem Espacial)
114. Problem CAVALO08 (12995. Cavalos)
115. Problem CHUVA08 (12997. Chuva)
116. Problem ORTOG08 (12998. Ortografia)
117. Problem FRETE08 (12999. Frete da Família Silva)

5
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

810. Rede ótica


Problem code: REDOTICA
Os caciques da regiao de Tutuaçu pretendem integrar suas tribos a chamada "aldeia global". A
primeira providencia foi a distribuiçao de telefones celulares a todos os pajés. Agora, planejam montar
uma rede de fibra ótica interligando todas as tabas. Esta empreitada requer que sejam abertas novas
picadas na mata, passando por reservas de flora e fauna. Conscientes da necessidade de preservar o
máximo possível o meio ambiente, os caciques encomendaram um estudo do impacto ambiental do
projeto. Será que voce consegue ajudá-los a projetar a rede de fibra ótica?

Tarefa
Vamos denominar uma ligaçao de fibra ótica entre duas tabas de um ramo de rede. Para possibilitar a
comunicaçao entre todas as tabas é necessário que todas elas estejam interligadas, direta (utilizando
um ramo de rede) ou indiretamente (utilizando mais de um ramo). Os caciques conseguiram a
informaçao do impacto ambiental que causará a construçao dos ramos. Alguns ramos, no entanto, nem
foram considerados no estudo ambiental, pois sua construçao é impossível.

Sua tarefa é escrever um programa para determinar quais ramos devem ser construídos, de forma a
possibilitar a comunicaçao entre todas as tabas, causando o menor impacto ambiental possível.

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de teste contém
dois números inteiros positivos N e M que indicam, respectivamente, o número de tabas e o número de
ramos de redes possíveis. As tabas sao numeradas de 1 a N. As M linhas seguintes contem tres inteiros
positivos X, Y e Z, que indicam que o ramo de rede que liga a taba X a taba Y tem impacto ambiental

1
Z. Com os conjuntos de teste dados sempre é possível interligar todas as tabas. O final da entrada é
indicado quando N = 0.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir uma lista dos ramos de redes que
devem ser construídos. A lista deve ser precedida de uma linha que identifica o conjunto de teste, no
formato "Teste n", onde n é numerado a partir de 1. A lista é composta por uma sequencia de
ramos a serem construídos, um ramo por linha. Um ramo é descrito por um par de tabas X e Y , com X
< Y. Os ramos de rede podem ser listados em qualquer ordem, mas nao deve haver repetiçao. Se
houver mais de uma soluçao possível, imprima apenas uma delas. O final de uma lista de ramos deve
ser marcado com uma linha em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser
seguida rigorosamente.

Exemplo
Entrada:
3 3
1 2 10
2 3 10
3 1 10
5 6
1 2 15
1 3 12
2 4 13
2 5 5
3 2 6
3 4 6
0 0

Saída:
Teste 1
1 2
1 3

Teste 2
1 3
2 3
2 5
3 4

Restriçoes
0 <= N <= 100 (N = 0 apenas para indicar o fim da entrada)
1 <= M <= N(N-1)/2
1 <= X <= 100
1 <= Y <= 100
1 <= Z <= 100

2
Added by: Wanderley Guimarăes
Date: 2006-04-19
Time limit: 1s
Source
50000B
limit:
Cluster: Pyramid (Intel Pentium III 733 MHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: Olimpiada Brasileira de Informatica 2000

3
SPOJ Problem Set (obi)

811. Quermesse
Problem code: QUERM
Os alunos do último ano resolveram organizar uma quermesse para arrecadar fundos para a festa de
formatura. A festa prometia ser um sucesso, pois o pai de um dos formandos, Teófilo, dono de uma
loja de informática, decidiu doar um computador para ser sorteado entre os que comparecessem. Os
alunos prepararam barracas de quentao, pipoca, doces, ensaiaram a quadrilha e colocaram a venda
ingressos numerados sequencialmente a partir de 1. O número do ingresso serviria para o sorteio do
computador. Ficou acertado que Teófilo decidiria o método de sorteio; em princípio o sorteio seria,
claro, computadorizado.

O local escolhido para a festa foi o ginásio da escola. A entrada dos participantes foi pela porta
principal, que possui uma roleta, onde passa uma pessoa por vez. Na entrada, um funcionário inseriu,
em uma lista no computador da escola, o número do ingresso, na ordem de chegada dos participantes.
Depois da entrada de todos os participantes, Teófilo começou a trabalhar no computador para preparar
o sorteio. Verificando a lista de presentes, notou uma característica notável: havia apenas um caso, em
toda a lista, em que o participante que possuia o ingresso numerado com i, havia sido a i-ésima
pessoa a entrar no ginásio. Teófilo ficou tao encantado com a coincidencia que decidiu que o sorteio
nao seria necessário: esta pessoa seria o ganhador do computador.

Tarefa
Conhecendo a lista de participantes, por ordem de chegada, sua tarefa é determinar o número do
ingresso premiado, sabendo que o ganhador é o único participante que tem o número do ingresso igual
a sua posiçao de entrada na festa.

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de teste contém
um número inteiro positivo N que indica o número de participantes da festa. A linha seguinte contém a
sequencia, em ordem de entrada, dos N ingressos das pessoas que participaram da festa. O final da
entrada é indicado quando N = 0. Para cada conjunto de teste da entrada haverá um único ganhador.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas. A primeira linha
identifica o conjunto de teste, no formato "Teste n", onde n é numerado a partir de 1. A segunda
linha deve conter o número do ingresso do ganhador, conforme determinado pelo seu programa. A
terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser
seguida rigorosamente.

1
Exemplo
Entrada:
4
4 5 3 1
10
9 8 7 6 1 4 3 2 12 10
0

Saída:
Teste 1
3

Teste 2
10

Restriçoes
0 <= N <= 10000 (N = 0 apenas para indicar o fim da entrada)

Added by: Wanderley Guimaraes


Date: 2006-04-19
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2000

2
SPOJ Problem Set (obi)

812. Bits Trocados


Problem code: BIT
As Ilhas Weblands formam um reino independente nos mares do Pacífico. Como é um reino recente, a
sociedade é muito influenciada pela informática. A moeda oficial é o Bit; existem notas de B$ 50,00,
B$10,00, B$5,00 e B$1,00. Voce foi contratado(a) para ajudar na programaçao dos caixas automáticos
de um grande banco das Ilhas Weblands.

Tarefa
Os caixas eletrônicos das Ilhas Weblands operam com todos os tipos de notas disponíveis, mantendo
um estoque de cédulas para cada valor (B$ 50,00, B$10,00, B$5,00 e B$1,00). Os clientes do banco
utilizam os caixas eletrônicos para efetuar retiradas de um certo número inteiro de Bits.

Sua tarefa é escrever um programa que, dado o valor de Bits desejado pelo cliente, determine o
número de cada uma das notas necessário para totalizar esse valor, de modo a minimizar a quantidade
de cédulas entregues. Por exemplo, se o cliente deseja retirar B$50,00, basta entregar uma única nota
de cinquenta Bits. Se o cliente deseja retirar B$72,00, é necessário entregar uma nota de B$50,00, duas
de B$10,00 e duas de B$1,00.

Entrada
A entrada é composta de vários conjuntos de teste. Cada conjunto de teste é composto por uma única
linha, que contém um número inteiro positivo V, que indica o valor solicitado pelo cliente. O final da
entrada é indicado por V = 0.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado
a partir de 1. Na segunda linha devem aparecer quatro inteiros I, J, K e L que representam o resultado
encontrado pelo seu programa: I indica o número de cédulas de B$50,00, J indica o número de
cédulas de B$10,00, K indica o número de cédulas de B$5,00 e L indica o número de cédulas de
B$1,00. A terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo,
deve ser seguida rigorosamente.

Exemplo
Entrada:
1
72
0

Saída:
Teste 1

1
0 0 0 1

Teste 2
1 2 0 2

Restriçoes
0 <= V <= 10000 (V = 0 apenas para indicar o fim da entrada)

Added by: Wanderley Guimaraes


Date: 2006-04-19
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2000

2
SPOJ Problem Set (obi)

813. Saldo de gols


Problem code: SALDO
Hipólito é um torcedor fanático. Coleciona flâmulas, bandeiras, recortes de jornal, figurinhas de
jogadores, camisetas e tudo o mais que se refira a seu time preferido. Quando ganhou um computador
de presente em uma festa, resolveu montar um banco de dados com os resultados de todos os jogos de
seu time ocorridos desde a sua fundaçao, em 1911. Depois de inseridos os dados, Hipólito começou a
ficar curioso sobre estatísticas de desempenho do time. Por exemplo, ele deseja saber qual foi o
período em que o seu time acumulou o maior saldo de gols. Como Hipólito tem o computador há
muito pouco tempo, nao sabe programar muito bem, e precisa de sua ajuda.

Tarefa
É dada uma lista, numerada seqüencialmente a partir de 1, com os resultados de todos os jogos do time
(primeira partida: 3 x 0, segunda partida: 1 x 2, terceira partida: 0 x 5 ...). Sua tarefa é escrever um
programa que determine em qual período o time conseguiu acumular o maior saldo de gols. Um
período é definido pelos números de seqüencia de duas partidas, A e B, onde A <= B. O saldo de gols
acumulado entre A e B é dado pela soma dos gols marcados pelo time em todas as partidas realizadas
entre A e B (incluindo as mesmas) menos a soma dos gols marcados pelos times adversários no
período. Se houver mais de um período com o mesmo saldo de gols, escolha o maior período (ou seja,
o período em que B - A é maior). Se ainda assim houver mais de uma soluçao possível, escolha
qualquer uma delas como resposta.

Entrada
Seu programa deve ler vários conjuntos de teste. A primeira linha de um conjunto de teste contém um
inteiro nao negativo, N, que indica o número de partidas realizadas pelo time (o valor N = 0 indica o
final da entrada). Seguem-se N linhas, cada uma contendo um par de números inteiros nao negativos X
e Y que representam o resultado da partida: X sao os gols a favor e Y os gols contra o time de Hipólito.
As partidas sao numeradas sequencialmente a partir de 1, na ordem em que aparecem na entrada.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado
a partir de 1. A segunda linha deve conter um par de inteiros I e J que indicam respectivamente a
primeira e última partidas do melhor período, conforme determinado pelo seu programa, exceto
quando o saldo de gols do melhor período for menor ou igual a zero; neste caso a segunda linha deve
conter a expressao "nenhum". A terceira linha deve ser deixada em branco. A grafia mostrada no
Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

1
Exemplo
Entrada:
2
2 3
7 1
9
2 2
0 5
6 2
1 4
0 0
5 1
1 5
6 2
0 5
3
0 2
0 3
0 4
0

Saída:
Teste 1
2 2

Teste 2
3 8

Teste 3
nenhum

Restriçoes
0 <= N <= 10000 (N = 0 apenas para indicar o fim da entrada)
> 1 <= A <= N <code>
> A <= B <= N<code>
> 0 <= X <= 50<code>
> 0 <= Y <= 50<code>
>

Added by:<td>Wanderley Guimaraes


Date: 2006-04-19
Time limit: 1s
Source limit: 50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2000

2
SPOJ Problem Set (obi)

814. Macaco-prego
Problem code: MACACO
O macaco-prego é um animal irrequieto e barulhento, merecedor também dos adjetivos desordeiro e
despudorado. A sua cabeça, encimada por uma densa pelagem negra ou marrom-escura, semelhante a
um gorro, torna seu aspecto inconfundível. Apesar de ser o macaco mais comum nas matas do país,
uma de suas sub-espécies encontra-se seriamente ameaçada de extinçao: o macacoprego-
do-peito-amarelo, que se distingue das demais pela coloraçao amarelada do peito e da parte anterior
dos braços.

Um grande esforço foi feito pelos primatologistas para aumentar a populaçao dos macacos-pregodo-
peito-amarelo. Sabe-se que eles se alimentam de plantas, das quais consomem preferencialmente
frutos e brotos. Alimentam-se também de muitos animais, preferencialmente lesmas, lagartas e ras, e
preferem as florestas mais densas. Para determinar o melhor local do país para criar uma nova reserva
ambiental para os macacos-prego-do-peito-amarelo, o governo fez um levantamento das regioes no
país onde as condiçoes preferidas desses animais ocorrem: regioes de floresta densa, regioes com
frutos, regioes com muitos brotos, etc. Ajude a salvar os macacos-pregodo- peito-amarelo.

Tarefa
As regioes propícias para o macaco-prego-do-peito-amarelo foram determinadas como retângulos
cujos lados sao todos verticais ou horizontais. Sua tarefa é encontrar o local ideal para a reserva
ambiental, definida como a interseçao de todas as regioes dadas.

[IMAGE]

As regioes foram divididas de tal forma que uma regiao nao tangencia qualquer outra regiao. Assim, a
interseçao entre quaisquer duas regioes ou é um retângulo ou é vazia.

Entrada
Seu programa deve ler vários conjuntos de teste. A primeira linha de um conjunto de teste contém um
inteiro nao negativo, N, que indica o número de regioes (o valor N = 0 indica o final da entrada).
Seguem-se N linhas, cada uma contendo quatro números inteiros X, Y, U e V que descrevem uma
regiao: o par X, Y representa a coordenada do canto superior esquerdo e o par U, V representa a
coordenada do canto inferior direito de um retângulo.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado
a partir de 1. A segunda linha deve conter as coordenadas do retângulo de interseçao encontrado pelo
seu programa, no mesmo formato utilizado na entrada. Caso a interseçao seja vazia, a segunda linha
deve conter a expressao "nenhum". A terceira linha deve ser deixada em branco. A grafia mostrada
no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

1
Exemplo
Entrada:
3
0 6 8 1
1 5 6 3
2 4 9 0
3
0 4 4 0
3 1 7 -3
6 4 10 0
0

Saída:
Teste 1
2 4 6 3

Teste 2
nenhum

Restriçoes
0 <= N <= 10000 (N = 0 apenas para indicar o fim da entrada)
-10000 <= X <= 10000
-10000 <= Y <= 10000
-10000 <= U <= 10000
-10000 <= V <= 10000

Added by: Wanderley Guimaraes


Date: 2006-04-20
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2000

2
SPOJ Problem Set (obi)

815. Temperatura Lunar


Problem code: LUA
Sem as proteçoes da atmosfera e do cinturao magnético que existem na Terra, a Lua fica exposta ao
ataque do Sol, que é um astro em constante explosao atômica. As explosoes do Sol emitem ondas
letais de partículas. Uma pessoa que ficasse desprotegida na superfície da Lua, num lugar onde o Sol
incidisse diretamente, sofreria um bombardeio radioativo tao intenso quanto se estivesse nas
imediaçoes da usina russa de Chernobyl no momento do acidente que matou 31 pessoas, em 1986.
Além da radiaçao solar, outro efeito desta falta de proteçao contra o Sol que existe na Lua é a enorme
variaçao de temperatura. Nas regioes próximas do equador lunar, a variaçao de temperatura é brutal,
passando de cerca de 130 graus positivos durante o dia a 129 graus negativos a noite.

Para estudar com mais precisao as variaçoes de temperatura na superfície da Lua, a NASA enviou a
Lua uma sonda com um sensor que mede a temperatura de 1 em 1 minuto. Um dado importante que os
pesquisadores desejam descobrir é como se comporta a média da temperatura, considerada em
intervalos de uma dada duraçao (uma hora, meia hora, oito horas, etc.). Por exemplo, para a seqüencia
de mediçoes 8, 20, 30, 50, 40, 20, -10, e intervalos de quatro minutos, as médias sao respectivamente
108/4=27, 140/4=35, 140/4=35 e 100/4=25.

Tarefa
Voce foi recentemente contratado pela NASA, e sua primeira tarefa é escrever um programa que,
conhecidos a seqüencia de temperaturas medidas pelo sensor, e o tamanho do intervalo desejado,
informe qual a maior e qual a menor temperatura média observadas, considerando o tamanho do
intervalo dado.

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de teste contém
dois números inteiros positivos N e M, que indicam respectivamente o número total de mediçoes de
temperatura de uma seqüencia obtida pelo sensor, e o tamanho dos intervalos, em minutos, em que as
médias devem ser calculadas. As N linhas seguintes contem um número inteiro cada, representando a
seqüencia de medidas do sensor. O final da entrada é indicado quando N = M = 0.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas. A primeira linha
identifica o conjunto de teste, no formato "Teste n", onde n é numerado a partir de 1. A segunda linha
deve conter dois números inteiros X e Y, separados por ao menos um espaço em branco, representando
respectivamente os valores da menor e da maior média de temperatura, conforme determinado pelo
seu programa. O valor da média deve ser truncado, se a média nao for um número inteiro (ou seja,
deve ser impressa apenas a parte inteira). A terceira linha deve ser deixada em branco. A grafia
mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

1
Exemplo
Entrada:
4 2
-5
-12
0
6
7 4
35
-35
5
100
100
50
50
0 0

Saída:
Teste 1
-8 3

Teste 2
26 75

Restriçoes
0 <= N <= 10000 (N = 0 apenas para indicar o fim da entrada)
> -200 <= Temperatura <= 200
> 1 <= M <= N
>

Added by:<td>Wanderley Guimaraes


Date: 2006-04-20
Time limit: 1s
Source limit: 50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2002

2
SPOJ Problem Set (obi)

816. Caça ao Tesouro


Problem code: TESOURO
Quando limpavam o porao da casa recentemente herdada, os primos Joao e José descobriram um
antigo mapa guardado no baú que havia sido de seu bisavô. O mapa parecia descrever uma ilha, era
muito antigo, e em meio a indicaçoes de caminhos pela ilha, continha apenas um nome: Huyn Chong
Chong. Curiosos, Joao e José pesquisaram o nome na bilbioteca do colégio e na Internet. Para sua
surpresa e excitaçao, o nome era relacionado a uma antiga lenda de um tesouro escondido por piratas
no século XVIII.

Encantados com a lenda, os primos acreditaram ter encontrado o mapa que os levaria ao tesouro,
escondido na ilha de Huyn Chong Chong, próximo a Coréia do Sul. O tesouro, dizia a lenda, continha
uma arca cheia de pedras preciosas muito raras e valiosas. Certos de que encontrariam o tesouro, os
primos embarcaram rumo a ilha. Cada um dos primos se imaginava mais esperto do que o outro, e
acreditava que encontraria o tesouro primeiro. Assim, eles combinaram que cada um ficaria com a
parte do tesouro que encontrasse. Os primos entao se separaram, e começaram a procurar o tesouro,
especialmente a arca. Cada um dos primos tomou o caminho que imaginava que o levaria até a arca, e
seguindo a indicaçao do mapa, ambos foram encontrando várias jóias pelo caminho.
Coincidentemente, os dois primos cheragam ao mesmo tempo no local onde a arca estava escondida.
Como os dois encontraram a arca ao mesmo tempo, eles tinham agora que decidir como dividir o
tesouro. Depois de analisar algumas alternativas, os primos concordaram em fazer a divisao da
seguinte forma. Cada um ficaria com a parte do tesouro que encontrou antes de chegar a arca, e o
conteúdo da arca seria dividido de forma que os dois ficassem com partes do tesouro total de mesmo
valor. Para fazer a divisao desta forma, ao chegar de volta ao Brasil, os primos mandaram avaliar cada
jóia do tesouro. Contudo, eles estao agora em dúvida se é possível fazer a divisao conforme eles
haviam combinado. Voce, como amigo dos dois primos (agora milionários), e esperando receber
alguma recompensa, dispôs-se a ajudá-los a descobrir se é possível fazer tal divisao.

Tarefa
Sao dados:

o valor dos objetos coletados por Joao e por José antes de encontrarem a arca;
uma lista de valores, correspondentes aos objetos encontrados dentro da arca.

Como as jóias sao muito valiosas, estes valores sao dados em unidades de R$ 1.000,00, ou seja, o
valor 10 significa R$ 10.000,00. Voce deve escrever um programa que determina se é possível dividir
os objetos da arca de forma que, considerados também os valores dos objetos encontrados
anteriormente (que ficarao com quem os encontrou), os primos recebam partes do tesouro com o
mesmo valor.

1
Entrada
Seu programa deve ler vários conjuntos de testes. A primeira linha de um conjunto de testes contém
tres números inteiros X, Y e N. Os valores X eY representam respectivamente a soma dos valores
encontrados por Joao e por José antes de chegarem a arca. O valor N indica o número de objetos
encontrados na arca. Seguem-se N linhas, cada uma contendo um número inteiro V, correspondendo
ao valor de um dos objetos da arca. O final da entrada é indicado por X = Y = N = 0.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado a
partir de 1. A segunda linha deve conter o caractere ‘S’ caso seja possível dividir o tesouro como
combinado pelos dois primos, ou o caractere ‘N’ caso contrário. A terceira linha deve ser deixada em
branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

Exemplo
Entrada:
10 20 4
3
8
7
2
1 1 6
2
7
7
12
5
3
0 0 0

Saída:
Teste 1
S

Teste 2
N

Restriçoes
0 <= X <= 50 (X = 0 apenas para indicar o final da entrada)
0 <= Y <= 50 (Y = 0 apenas para indicar o final da entrada)
0 <= N <= 100 (N = 0 apenas para indicar o final da entrada)
1 <= V <= 100

Added by: Wanderley Guimaraes


Date: 2006-04-20
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2002

2
SPOJ Problem Set (obi)

817. Dobradura
Problem code: DOBRA

Tarefa
Zezinho tem aulas de Iniciaçao Artística em sua escola, e recentemente aprendeu a fazer dobraduras
em papel. Ele ficou fascinado com as inúmeras possibilidades de se dobrar uma simples folha de
papel. Como Zezinho gosta muito de matemática, resolveu inventar um quebra-cabeça envolvendo
dobraduras. Zezinho definiu uma operaçao de dobradura D que consiste em dobrar duas vezes uma
folha de papel quadrada de forma a conseguir um quadrado com 1/4 do tamanho original, conforme
ilustrado na figura.

[IMAGE]

Depois de repetir N vezes esta operaçao de dobradura D sobre o papel, Zezinho cortou o quadrado
resultante com um corte vertical e um corte horizontal, conforme a figura abaixo.

[IMAGE]

Zezinho lançou entao um desafio aos seus colegas: quem adivinha quantos pedaços de papel foram
produzidos?

Entrada
A entrada é composta de vários conjuntos de teste. Cada conjunto de teste é composto de uma única
linha, contendo um número inteiro N que indica o número de vezes que a operaçao de dobradura D foi
aplicada. O final da entrada é indicado por N = -1.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado a
partir de 1. A segunda linha deve conter o número de pedaços de papel obtidos depois de cortar a
dobradura, calculado pelo seu programa. A terceira linha deve ser deixada em branco. A grafia
mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

Exemplo
Entrada:
1
0
-1

Saída:
Teste 1

1
9

Teste 2
4

Restriçoes
-1 <= N <= 15 (N = -1 apenas para indicar o fim da entrada)

Added by: Wanderley Guimaraes


Date: 2006-04-21
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2002

2
SPOJ Problem Set (obi)

818. Aeroporto
Problem code: AERO
A crescente utilizaçao do transporte aéreo preocupa os especialistas, que preveem que o
congestionamento em aeroportos poderá se tornar um grande problema no futuro. Os números atuais já
sao alarmantes: relatórios oficiais demonstram que na Europa, em junho de 2001, houve uma média de
7.000 atrasos de vôos por dia. Preocupada com a previsao dos seus especialistas em tráfego aéreo, a
Associaçao de Transporte Aéreo Internacional (ATAI) está começando um estudo para descobrir quais
sao os aeroportos onde o tráfego aéreo pode vir a ser mais problemático no futuro.

Tarefa
Como programador recém contratado pela ATAI voce foi encarregado de escrever um programa para
determinar, a partir de uma listagem de aeroportos e vôos, qual aeroporto possui maior probabilidade
de congestionamento no futuro. Como medida da probabilidade de congestionamento será utilizado
neste estudo o número total de vôos que chegam ou que partem de cada aeroporto.

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de teste contém
dois números inteiros A e V, que indicam respectivamente o número de aeroportos e o número de
vôos. Os aeroportos sao identificados por inteiros de 1 a A. As V linhas seguintes contem cada uma a
informaçao de um vôo, representada por um par de números inteiros positivos X e Y, indicando que há
um vôo do aeroporto X para o aeroporto Y. O final da entrada é indicado quando A = V = 0.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas. A primeira linha
identifica o conjunto de teste, no formato "Teste n", onde n é numerado a partir de 1. A segunda linha
deve conter o identificador do aeroporto que possui maior tráfego aéreo. Caso mais de um aeroporto
possua este valor máximo, voce deve listar todos estes aeroportos, em ordem crescente de
identificaçao, e separados por pelo menos um espaço em branco. A terceira linha deve ser deixada em
branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

Exemplo
Entrada:
5 7
1 3
2 1
3 2
3 4
4 5
3 5
2 5
3 5
1 3

1
1 2
3 2
1 2
2 1
0 0

Output:
Teste 1
3

Teste 2
1 2

Restriçoes
0 <= A <= 100 (A = 0 apenas para indicar o fim da entrada)
0 <= V <= 10000 (V = 0 apenas para indicar o fim da entrada)
1 <= X <= A
1 <= Y <= A
X != Y

Added by: Wanderley Guimaraes


Date: 2006-04-21
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2002

2
SPOJ Problem Set (obi)

819. Pedágio
Problem code: PEDAGIO
Como premio pela primeira colocaçao na Olimpíada Brasileira de Informática, Juquinha e sua família
ganharam uma viagem de uma semana a Coréia do Sul. Como o país é deslumbrante, com tradiçoes,
cultura, arquitetura e culinária muito diferentes das do Brasil, o pai de Juquinha, o Sr. Juca, decidiu
alugar um carro para conhecer melhor o país. As estradas sao muito bem cuidadas; todas sao de
sentido duplo, e duas cidades podem ser ligadas diretamente por mais de uma estrada. No entanto, em
todas as estradas paga-se um pedágio de valor fixo (há um pedágio em cada direçao, entre duas
cidades). Como o Sr. Juca nao tem muito dinheiro para gastar, as viagens com o carro devem ser muito
bem planejadas.

Tarefa
Escreva um programa que, conhecidas as cidades e estradas existentes no país, e a cidade onde
Juquinha e sua família estao, encontre cada cidade (que nao a cidade onde eles estao) que possa ser
visitada por eles, dada a restriçao de que o Sr. Juca deseja pagar no máximo P pedágios (considerando
apenas a viagem de ida).

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de teste contém
quatro números inteiros C, E, L e P. Os valores C e E indicam respectivamente o número de cidades e
o número de estradas existentes. As cidades sao identificadas por inteiros de 1 a C. os valores L e P
indicam, respectivamente, a cidade onde a família de Juquinha está no momento e o número máximo
de pedágios que o Sr. Juca está disposto a pagar. As E linhas seguintes contem cada uma a informaçao
de uma estrada, representada por um par de números inteiros positivos X e Y, indicando que há uma
estrada (de sentido duplo) da cidade X para a cidade Y. O final da entrada é indicado por C = E = L =
P = 0.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado a
partir de 1. Na segunda linha devem aparecer os identificadores das cidades que podem ser alcançadas,
em ordem crescente, separados por pelo menos um espaço em branco. A terceira linha deve ser
deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

Exemplo
Entrada:
5 4 2 1
1 2
2 3
3 4
4 5

1
9 12 1 2
2 1
1 5
2 1
3 2
9 3
3 4
4 8
4 7
7 6
5 6
4 5
3 7
0 0 0 0

Output:
Teste 1
1 3

Teste 2
2 3 4 5 6

Restriçoes
0 <= C <= 50 (C = 0 apenas para indicar o fim da entrada)
0 <= E <= 2500 (E = 0 apenas para indicar o fim da entrada)
0 <= L <= C (L = 0 apenas para indicar o fim da entrada)
0 <= P <= C (P = 0 apenas para indicar o fim da entrada)
1 <= X <= C
1 <= Y <= C

Added by: Wanderley Guimaraes


Date: 2006-04-21
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2002

2
SPOJ Problem Set (obi)

840. Cofrinhos da Vó Vitória


Problem code: COFRE
Vó Vitória mantém, desde o nascimento dos netos Joaozinho e Zezinho, um ritual que faz a alegria dos
meninos. Ela guarda todas as moedas recebidas como troco em dois pequenos cofrinhos, um para cada
neto. Quando um dos cofrinhos fica cheio, ela chama os dois netos para um alegre almoço, ao final do
qual entrega aos garotos as moedas guardadas nos cofrinhos de cada um.

Ela sempre foi muito zelosa quanto a distribuiçao igualitária do troco arrecadado. Quando, por força
do valor das moedas, ela nao consegue depositar a mesma quantia nos dois cofrinhos, ela memoriza a
diferença de forma a compensá-la no próximo depósito.

Tarefa
Vó Vitória está ficando velha e tem medo que deslizes de memória a façam cometer injustiças com os
netos, deixando de compensar as diferenças entre os cofrinhos. Sua tarefa é ajudar Vó Vitória,
escrevendo um programa de computador que indique as diferenças entre os depósitos, de forma que
ela nao tenha que preocupar-se em memorizá-las.

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de teste contém
um número inteiro N, que indica o número de depósitos nos cofrinhos. As N linhas seguintes
descrevem cada uma um depósito nos cofrinhos; o depósito é indicado por dois valores inteiros J e Z,
separados por um espaço em branco, representando respectivamente os valores, em centavos,
depositados nos cofres de Joaozinho e Zezinho. O final da entrada é indicado por N = 0.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir um conjunto de linhas na saída. A
primeira linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é
numerado seqüencialmente a partir de 1. A seguir seu programa deve escrever uma linha para cada
depósito do conjunto de testes. Cada linha deve conter um inteiro que representa a diferença (em
centavos) entre o valor depositado nos cofrinhos do Joaozinho e do Zezinho. Deixe uma linha em
branco ao final de cada conjunto de teste. A grafia mostrada no Exemplo de Saída, abaixo, deve ser
seguida rigorosamente.

Exemplo
Entrada:
3
20 25
10 5
10 10
4
0 5
12 0

1
0 20
17 1
0

Saída:

Teste 1
-5
0
0

Teste 2
-5
7
-13
3

Restriçoes
0 <= N <= 100 (N = 0 apenas para indicar o fim da entrada)
0 <= J <= 100 (valor de cada depósito no cofre de Joaozinho)
0 <= Z <= 100 (valor de cada depósito no cofre de Zezinho)

Added by: Wanderley Guimaraes


Date: 2006-05-05
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2003

2
SPOJ Problem Set (obi)

841. Estágio
Problem code: ESTAGIO
Voce conseguiu um estágio para trabalhar como programador na secretaria da sua escola. Como
primeira tarefa, Dona Vilma, a coordenadora, solicitou que voce aprimore um programa que foi
desenvolvido pelo estagiário anterior. Esse programa tem como entrada uma lista de nomes e de
médias finais dos alunos de uma turma, e determina o aluno com a maior média na turma. Dona Vilma
pretende utilizar o programa para premiar o melhor aluno de cada turma da escola. O programa
desenvolvido pelo estagiário anterior encontra-se no final (em C, C++ e Pascal).

Como voce pode verificar, o programa na forma atual tem uma imperfeiçao: no caso de haver alunos
empatados com a melhor média na turma, ele imprime apenas o primeiro aluno que aparece na lista.

Tarefa
Dona Vilma deseja que voce altere o programa para que ele produza uma lista com todos os alunos da
turma que obtiveram a maior média, e nao apenas um deles. Voce consegue ajudá-la nesta tarefa?

Entrada
A entrada é constituída de vários conjuntos de teste, representando várias turmas. A primeira linha de
um conjunto de testes contém um número inteiro N (1 <= N <= 1000) que indica o total de alunos
na turma. As N linhas seguintes contem, cada uma, um par de números inteiros C (1 <= C <=
20000) e M (0 <= M <= 100), indicando respectivamente o código e a média de um aluno. O
final da entrada é indicado por uma turma com N = 0.

Saída
Para cada turma da entrada seu programa deve produzir tres linhas na saída. A primeira linha deve
conter um identificador do conjunto de teste, no formato "Turma n", onde n é numerado a partir de 1.
A segunda linha deve conter os códigos dos alunos que obtiveram a maior média da turma. Os códigos
dos alunos devem aparecer na mesma ordem da entrada, e cada um deve ser seguido de um espaço em
branco. A terceira linha deve ser deixada em branco. O formato mostrado no exemplo de saída abaixo
deve ser seguido rigorosamente.

Exemplo
Entrada:
3
1 85
2 91
3 73
5
12300 81
12601 99
15023 76
10111 99

1
212 99
0

Saída:
Turma 1
2

Turma 2
12601 10111 212

Restriçoes
0 <= N <= 1000 (N = 0 apenas para indicar o fim da entrada)
1 <= C <= 20000
0 <= M <= 100

Código em Pascal
program estagio;
const MAX_ALUNOS = 1000;
type
registro_aluno = record
codigo, media : integer;
end;
var
alunos : array[1..MAX_ALUNOS] of registro_aluno;
n, i, indice_melhor, turma : integer;
begin
readln(n); { le numero de alunos da primeira turma }
turma := 1;
while n > 0 do begin
for i := 1 to n do { le dados dos alunos }
readln(alunos[i].codigo, alunos[i].media);
indice_melhor := 1;
for i := 2 to n do { procura aluno de maior media }
if alunos[i].media > alunos[indice_melhor].media then
indice_melhor := i;
{ escreve resposta }
writeln(’Turma ’, turma);
turma := turma + 1;
writeln(alunos[indice_melhor].codigo);
writeln;
{ le numero de alunos da proxima turma }
readln(n);
end;
end.

Código em C
#include <stdio.h>
#define MAX_ALUNOS 1000
int main()
{
int i, indice_melhor, n;
int turma=1;
struct
{
int codigo, media;
} alunos[MAX_ALUNOS];
/* le numero de alunos da primeira turma */

2
scanf("%d", &n);
while (n > 0)
{
/* le dados dos alunos */
for (i = 0; i < n; i++)
scanf("%d %d", &alunos[i].codigo, &alunos[i].media);
/* procura aluno de maior media */
indice_melhor = 0;
for (i = 1; i < n; i++)
if (alunos[i].media > alunos[indice_melhor].media)
indice_melhor = i;
/* escreve resposta */
printf("Turma %d\n%d\n\n", turma++, alunos[indice_melhor].codigo);
/* le numero de alunos da proxima turma */
scanf("%d", &n);
}
return 0;
}

Código em C++
#include <iostream>
const int MAX_ALUNOS = 1000;
int main()
{
int i, indice_melhor, n;
int turma=1;
struct
{
int codigo, media;
} alunos[MAX_ALUNOS];
// le numero de alunos da primeira turma
cin >> n;
while (n > 0)
{
// le dados dos alunos
for (i = 0; i < n; i++)
cin >> alunos[i].codigo >> alunos[i].media;
// procura aluno de maior media
indice_melhor = 0;
for (i = 1; i < n; i++)
if (alunos[i].media > alunos[indice_melhor].media)
indice_melhor = i;
// escreve resposta
cout << "Turma " << turma++ << "\n";
cout << alunos[indice_melhor].codigo << "\n\n";
// le numero de alunos da proxima turma
cin >> n;
}
return 0;
}

Added by: Wanderley Guimaraes


Date: 2006-05-05
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2003

3
SPOJ Problem Set (obi)

842. Torres de Hanói


Problem code: OBIHANOI
O quebra-cabeças Torres de Hanoi é muito antigo e conhecido, sendo constituído de um conjunto de N
discos de tamanhos diferentes e tres pinos verticais, nos quais os discos podem ser encaixados.

[IMAGE]

Cada pino pode conter uma pilha com qualquer número de discos, desde que cada disco nao seja
colocado acima de outro disco de menor tamanho. A configuraçao inicial consiste de todos os discos
no pino 1. O objetivo do quebra-cabeças é mover todos os discos para um dos outros pinos, sempre
obedecendo a restriçao de nao colocar um disco sobre outro menor.

Um algoritmo para resolver este problema é o seguinte.


procedimento Hanoi(N, Orig, Dest, Temp)
se N = 1 entao
mover o menor disco do pino Orig para o pino Dest;
senao
Hanoi(N-1, Orig, Temp, Dest);
mover o N-ésimo menor disco do pino Orig para o pino Dest;
Hanoi(N-1, Temp, Dest, Orig);
fim-se
fim

Tarefa
Sua tarefa é escrever um programa que determine quantos movimentos de trocar um disco de um pino
para outro serao executados pelo algoritmo acima para resolver o quebra-cabeça.

Entrada
A entrada possui vários conjuntos de teste. Cada conjunto de teste é composto por uma única linha,
que contém um único número inteiro N (0 <= N <= 30), indicando o número de discos. O final da
entrada é indicado por N = 0.

Saída
Para cada conjunto de teste, o seu programa deve escrever tres linhas na saída. A primeira linha deve
conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado
seqüencialmente a partir de 1. A segunda linha deve conter o número de movimentos que sao
executados pelo algoritmo dado para resolver o problema das Torres de Hanói com N discos. A
terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser
seguida rigorosamente.

1
Exemplo
Entrada:
1
2
0

Saída
Teste 1
1

Teste 2
3

Restriçoes
0 <= N <= 30 (N = 0 apenas para indicar o final da entrada)

Added by: Wanderley Guimaraes


Date: 2006-05-05
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2003

2
SPOJ Problem Set (obi)

843. Supermercado
Problem code: SUPERMER
A rede de supermercados BemBom, da cidade de Planalto, decidiu reformular o armazenamento de
seus estoques. No sistema atual, cada uma das lojas da rede possui espaço para armazenar um pequeno
estoque, sendo freqüentemente necessário transportar mercadorias de uma loja para outra. Para
racionalizar o transporte e aumentar a capacidade de estoque, a direçao da rede Bem-Bom decidiu
instalar um depósito central. De forma a diminuir os custos com transporte, ficou definido que o novo
depósito deve ser localizado em um quarteirao que minimize a soma das distâncias dele até todas as
lojas da rede.

Por ser uma cidade planejada, Planalto possui uma característica muito peculiar. Todas as suas ruas
sao orientadas na direçao leste-oeste ou norte-sul, e todos os quarteiroes sao do mesmo tamanho. Veja
uma parte do mapa de Planalto na figura abaixo. Os quarteiroes em Planalto sao identificados pelo
número de quadras, em cada direçao, que os separam da localizaçao da prefeitura (0,0). Localizaçoes a
leste e a norte da prefeitura sao identificadas por coordenadas positivas, e localizaçoes a oeste e a sul
por coordenadas negativas.

[IMAGE]

Parte do mapa de Planalto

Tarefa
A sua tarefa é, dadas as coordenadas dos quarteiroes onde estao localizados todos os supermercados da
rede, determinar o quarteirao onde deve ser instalado o novo depósito. A localizaçao deste depósito
deve ser tal que a soma das distâncias entre o depósito e as lojas, em número de quarteiroes em ambas
as direçoes, seja a menor possível. A distância entre dois quarteiroes é dada pela distância entre eles na
direçao leste-oeste mais a distância na direçao norte-sul. Por exemplo, a distância entre os quarteiroes
(2,-1) e (4, 3) é 2 + 4 = 6.

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de cada conjunto de teste contém
um número inteiro S que é o número de supermercados da rede. A seguir, sao dadas S linhas, cada
uma contendo dois números inteiros X e Y, representando as coordenadas do quarteirao onde se situa
um dos supermercados. X representa a coordenada na direçao leste-oeste e Y represetna a coordenada
na direçao norte-sul. O final da entrada é dado por um conjunto de teste com S = 0.

Saída
Para cada conjunto de teste, o seu programa deve escrever tres linhas na saída. A primeira linha deve
conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado
seqüencialmente a partir de 1. A segunda linha deve conter as coordenadas X e Y do quarteirao onde
deve ser instalado o novo depósito, separadas por um espaço em branco. Se mais de um quarteirao

1
puder ser escolhido como localizaçao do depósito, seu programa pode imprimir qualquer um deles. A
terceira linha deve ser deixada em branco. O formato do exemplo de saída abaixo deve ser seguido
rigorosamente.

Exemplo
Entrada:
4
1 2
-3 -3
4 -1
-5 0
5
1 3
7 13
25 13
15 14
25 1
0

Saída:
Teste 1
-2 0

Teste 2
15 13

Restriçoes
0 <= S <= 1000 (S = 0 apenas para indicar o final da entrada)
-1000 <= X <= 1000
-1000 <= Y <= 1000

Added by: Wanderley Guimaraes


Date: 2006-05-05
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2003

2
SPOJ Problem Set (obi)

844. Número de Erdos


Problem code: NUMERDOS
O matemático húngaro Paul Erdos (1913-1996), um dos mais brilhantes do século XX, é considerado
o mais prolífico matemático da história. Erdos publicou mais de 1500 artigos, em colaboraçao com
cerca de outros 450 matemáticos. Em homenagem a este genio húngaro, os matemáticos criaram um
número, denominado "número de Erdos". Toda pessoa que escreveu um artigo com Erdos tem o
número 1. Todos que nao possuem número 1, mas escreveram algum artigo juntamente com alguém
que possui número 1, possuem número 2. E assim por diante. Quando nenhuma ligaçao pode ser
estabelecida entre Erdos e uma pessoa, diz-se que esta possui número de Erdos infinito. Por exemplo,
o número de Erdos de Albert Einstein é 2. E, talvez surpreendentemente, o número de Erdos de Bill
Gates é 4.

Tarefa
Sua tarefa é escrever um programa que, a partir de uma lista de autores de artigos, determine o número
de Erdos dos autores.

Entrada
A entrada é constituída por vários conjuntos de teste. A primeira linha de um conjunto de teste contém
um número inteiro A (1 <= A <= 100), que indica o número de artigos. Cada uma das A linhas
seguintes contém a lista de autores de um artigo. Cada autor é identificado pela inicial de seu nome
(em maiúscula), seguida de um ponto e de um espaço em branco (indicando que o nome está
abreviado), seguida de seu último sobrenome (‘P. Erdos’, por exemplo). O sobrenome de um
autor possui, no máximo, 15 letras, e apenas a letra inicial aparece em maiúscula. Os autores sao
separados por vírgulas, e a lista de autores de um artigo termina com um ponto (veja os exemplos
abaixo). Um único espaço em branco separa a abreviatura do nome do sobrenome, bem como o nome
de um autor do anterior. Espaços em branco nao sao usados em outros locais. Um artigo possui, no
máximo, 10 autores, e o total de autores nao excede 100. O final da entrada é indicado por A = 0.

Saída
Para cada conjunto de teste da entrada seu programa deve produzir um conjunto de linhas na saída. A
primeira linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é
numerado seqüencialmente a partir de 1. A seguir devem aparecer uma linha para cada autor do
conjunto de testes (exceto o próprio P. Erdos). Cada linha deve conter o nome do autor seguido pelo
caractere ‘:’, um espaço em branco e o seu número de Erdos. Caso o número de Erdos de um
determinado autor seja infinito, escreva ‘infinito’. A saída deve ser ordenada alfabeticamente
pelo sobrenome do autor, e, em caso de mesmo sobrenome, o desempate deve ser feito pela inicial do
primeiro nome. Imprima uma linha em branco ao final de cada conjunto de teste. A grafia mostrada no
Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

1
Exemplo
Entrada:
5
P. Erdos, A. Selberg.
P. Erdos, J. Silva, M. Souza.
M. Souza, A. Selberg, A. Oliveira.
J. Ninguem, M. Ninguem.
P. Duarte, A. Oliveira.
2
Z. Silva, P. Erdos.
Z. Souza.
0

Saída
Teste 1
P. Duarte: 3
J. Ninguem: infinito
M. Ninguem: infinito
A. Oliveira: 2
A. Selberg: 1
J. Silva: 1
M. Souza: 1

Teste 2
Z. Silva: 1
Z. Souza: infinito

Restriçoes
0 <= A <= 100 (número de artigos de um caso de teste; A = 0 apenas para indicar final da entrada)
1 <= tamanho, em número de letras, do sobrenome de um autor <= 15
1 <= número de autores de um artigo <= 10
1 <= número total de autores em um conjunto de teste <= 100

Added by: Wanderley Guimaraes


Date: 2006-05-05
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2003

2
SPOJ Problem Set (obi)

845. Tetris
Problem code: OBITETRI
A sua turma do colégio resolveu organizar um campeonato de tetris. Após discussao sobre as regras,
ficou definido que cada aluno jogaria um total de 12 partidas. Das 12 pontuaçoes obtidas por um
aluno, a maior e a menor sao descartadas, e as demais sao somadas, resultando na pontuaçao final do
aluno.

Tarefa
Como voce possui conhecimentos de programaçao, acabou sendo designado pela turma para escrever
um programa para imprimir a classificaçao final do campeonato, a partir das pontuaçoes de cada
jogador.

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de testes contém
um número inteiro J, que indica o número de jogadores que participaram do campeonato. A seguir,
para cada jogador há duas linhas na entrada: a primeira possui o nome do jogador (formado apenas por
letras, sendo apenas a inicial em maiúscula, e com no máximo 15 letras), e a segunda possui as 12
pontuaçoes que o jogador obteve, separadas por espaço. As pontuaçoes sao inteiros entre 0 e 1000. O
final da entrada é indicado por um conjunto de teste com J = 0.

Saída
Para cada conjunto de teste, o seu programa deve escrever uma linha contendo o identificador do
conjunto de teste, no formato "Teste n", onde n é numerado seqüencialmente a partir de 1. A seguir, o
seu programa deve escrever a classificaçao final no campeonato, utilizando uma linha para cada
participante. Cada linha deve conter tres informaçoes, separadas por um espaço em branco: a
classificaçao do jogador, a sua pontuaçao final, e o seu nome. A classificaçao de um jogador é igual a
1 mais o número de jogadores que obtiveram pontuaçao maior do que a sua. Em caso de empate, os
jogadores devem ser ordenados em ordem alfabética. Depois de toda a classificaçao, deve ser deixada
uma linha em branco. O formato do exemplo de saída abaixo deve ser seguido rigorosamente.

Exemplo
Entrada:
4
Zezinho
100 123 133 333 400 300 129 200 360 340 200 600
Luizinho
60 50 120 250 170 190 190 220 260 270 290 300
Carlinhos
10 10 20 10 10 10 10 20 20 20 20 20
Joaozinho
200 300 400 400 500 500 500 600 650 650 700 810
3

1
Pedrinho
100 100 200 200 300 300 400 400 500 500 600 600
Huguinho
50 100 200 200 300 300 500 500 400 400 600 700
Zezinho
100 100 100 100 100 100 100 100 100 100 100 100
0

Saída:
Teste 1
1 5200 Joaozinho
2 2518 Zezinho
3 2020 Luizinho
4 150 Carlinhos

Teste 2
1 3500 Huguinho
1 3500 Pedrinho
3 1000 Zezinho

Restriçoes
0 <= J <= 1000 (J = 0 apenas para indicar final da entrada)
0 <= pontuaçao em uma partida <= 1000
1 <= tamanho dos nomes, em número de letras <= 15

Added by: Wanderley Guimaraes


Date: 2006-05-05
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2003

2
SPOJ Problem Set (obi)

1330. Meteoros
Problem code: METEORO
Em noites sem nuvens pode-se muitas vezes observar pontos brilhantes no céu que se deslocam com
grande velocidade, e em poucos segundos desaparecem de vista: sao as chamadas estrelas cadentes, ou
meteoros. Meteoros sao na verdade partículas de poeira de pequenas dimensoes que, ao penetrar na
atmosfera terrestre, queimam-se rapidamente (normalmente a uma altura entre 60 120 quilômetros).
Se os meteoros sao suficientemente grandes, podem nao queimar-se completamente na atmosfera e
dessa forma atingem a superfície terrestre: nesse caso sao chamados de meteoritos.

Zé Felício é um fazendeiro que adora astronomia e descobriu um portal na Internet que fornece uma
lista das posiçoes onde caíram meteoritos. Com base nessa lista, e conhecendo a localizaçao de sua
fazenda, Zé Felício deseja saber quantos meteoritos caíram dentro de sua propriedade. Ele precisa de
sua ajuda para escrever um programa de computador que faça essa verificaçao automaticamente.

Tarefa
Sao dados:

uma lista de pontos no plano cartesiano, onde cada ponto corresponde a posiçao onde caiu um
meteorito;
as coordenadas de um retângulo que delimita uma fazenda.

As linhas que delimitam a fazenda sao paralelas aos eixos cartesianos. Sua tarefa é escrever um
programa que determine quantos meteoritos caíram dentro da fazenda (incluindo meteoritos que
caíram exatamente sobre as linhas que delimitam a fazenda).

Entrada
Seu programa deve ler vários conjuntos de testes. A primeira linha de um conjunto de testes quatro
números inteiros X1, Y1, X2 e Y2, onde (X1, Y1) é a coordenada do canto superior esquerdo e
(X2, Y2) é a coordenada do canto inferior direito do retângulo que delimita a fazenda. A segunda
linha contém um inteiro, N, que indica o número de meteoritos. Seguem-se N linhas, cada uma
contendo dois números inteiros X e Y, correspondendo as coordenadas de cada meteorito. O final da
entrada é indicado por X1 = Y1 = X2 = Y2 = 0.
Exemplo de entrada
2 4 5 1
2
1 2
3 3
2 4 3 2
3
1 1
2 2
3 3
0 0 0 0

1
Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado a
partir de 1. A segunda linha deve conter o número de meteoritos que caíram dentro da fazenda. A
terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser
seguida rigorosamente.
Exemplo de saída
Teste 1
1

Teste 2
2

(esta saída corresponde ao exemplo de entrada acima)

Restriçoes
0 <= N <= 10.000
> 0 <= X <= 10.000
> 0 <= Y <= 10.000
> 0 <= X1 < X2 <= 10.000
> 0 <= Y2 < Y1 <= 10.000
><p>

Added by: Wanderley Guimaraes


Date: 2007-02-24
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2001

2
SPOJ Problem Set (obi)

1331. Dominó
Problem code: OBIDOMIN
Todos conhecem o jogo de dominós, em que peças com dois valores devem ser colocadas na mesa em
seqüencia, de tal forma que os valores de peças imediatamente vizinhas sejam iguais. O objetivo desta
tarefa é determinar se é possível colocar todas as peças de um conjunto dado em uma formaçao válida.

Tarefa
É dado um conjuto de peças de dominó. Cada peça tem dois valores X e Y, com X e Y variando de 0 a
6 (X pode ser igual a Y). Sua tarefa é escrever um programa que determine se é possível organizar
todas as peças recebidas em seqüencia, obedecendo as regras do jogo de dominó.

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de testes contém
um número inteiro N que indica a quantidade de peças do conjunto. As N linhas seguintes contem, cada
uma, a descriçao de uma peça. Uma peça é descrita por dois inteiros X e Y (0 <= X <= 6 e 0
<= Y <= 6) que representam os valores de cada lado da peça. O final da entrada é indicado por N
= 0.
Exemplo de Entrada
3
0 1
2 1
2 1
2
1 1
0 0
6
3 0
0 0
1 6
4 1
0 6
2 3
0

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado a
partir de 1. A segunda linha deve conter a expressao "sim" se for possível organizar todas as peças
em uma formaçao válida ou a expressao "nao" (note a ausencia de acento) caso contrário. A terceira
linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida
rigorosamente.

1
Exemplo de Saída
Teste 1
sim

Teste 2
nao

Teste 3
sim

(esta saída corresponde ao exemplo de entrada acima)

Restriçoes
0 <= N <= 100 (N = 0 apenas para indicar o final da entrada)

Added by: Wanderley Guimaraes


Date: 2007-02-24
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2001

2
SPOJ Problem Set (obi)

1332. Dengue
Problem code: DENGUE
A Costa do Mosquito é um país pequeno mas paradisíaco. Todos os habitantes tem boas moradias,
bons empregos, o clima é agradável, e os governantes sao justos e incorruptíveis. O sistema de
transporte público da Costa do Mosquito é composto de uma rede de linhas de trem. O sistema foi
projetado de forma peculiar: existe um único percurso ligando duas quaisquer vilas (esse percurso
possivelmente passa por outras vilas). Por exemplo, na figura abaixo, que mostra um trecho do mapa
da Costa do Mosquito, há apenas um percurso entre as vilas A e C, passando pelas vilas B, G e D. Uma
tarifa fixa de M$ 1,00 é cobrada por cada viagem entre vilas vizinhas; assim, para uma viagem de A
a C o usuário gasta M$ 4,00.

Devido a um inesperado surto de dengue, o Ministério da Saúde da Costa do Mosquito resolveu


montar um Posto de Vacinaçao. Para evitar que habitantes gastem muito dinheiro para se deslocar até
a vila onde ficará o Posto de Vacinaçao, o Ministério da Saúde decidiu que este deverá ser instalado
em uma vila de forma que o gasto com transporte até o Posto, para os habitantes que gastarem mais,
seja o menor possível (para o caso da figura abaixo a vila escolhida seria G).
E
|
|
A --- B --- G --- D --- C
|
|
F
Figura: Trecho do mapa da Costa do Mosquito.

Tarefa
Sua tarefa é escrever um programa que determine uma vila onde deve ser instalado o Posto de
Vacinaçao. Esta vila deve ser tal que o custo com transporte, para os habitantes que tiverem maior
custo, seja o menor possível. Note que devido a característica peculiar do sistema viário, ou haverá
uma única vila que satisfaz essa restriçao, ou haverá duas vilas que a satisfazem. No caso de existirem
duas vilas apropriadas, qualquer uma delas serve como soluçao.

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de testes contém
um número inteiro N que indica a quantidade de vilas do país. As vilas sao numeradas de 1 a N. As
N-1 linhas seguintes contem, cada uma, dois inteiros positivos X e Y que indicam que a vila X tem um
caminho que a liga diretamente com a vila Y, sem passar por outras vilas. O final da entrada é indicado
por N = 0.

1
Exemplo de Entrada
2
1 2
7
1 2
2 5
7 4
7 2
4 6
3 4
1
0

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado a
partir de 1. A segunda linha deve conter o número da vila na qual deve ser instalado o Posto de
Vacinaçao. A terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída,
abaixo, deve ser seguida rigorosamente.
Exemplo de Saída
Teste 1
1

Teste 2
7

Teste 3
1

(esta saída corresponde ao exemplo de entrada acima)

Restriçoes
0 <= N <= 100 (N = 0 apenas para indicar o final da entrada)

Added by: Wanderley Guimaraes


Date: 2007-02-24
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2001

2
SPOJ Problem Set (obi)

1333. Sorvete
Problem code: SORVETE
Joaozinho é um menino que costuma ir a praia todos os finais de semana com seus pais. Eles
freqüentam sempre a mesma praia, mas cada semana o pai de Joaozinho estaciona o carro em um local
diferente ao longo da praia, e instala sua família em um ponto na praia em frente ao carro. Joaozinho é
muito comilao, e adora de tomar sorvete na praia. Contudo, alguns dias acontece de nenhum sorveteiro
passar pelo local onde eles estao. Intrigado com isto, e nao querendo mais ficar sem tomar seu sorvete
semanal, Joaozinho foi até a Associaçao dos Sorveteiros da Praia (ASP), onde ficou sabendo que cada
sorveteiro passa o dia percorrendo uma mesma regiao da praia, indo e voltando. Além disto, cada
sorveteiro percorre todos os dias a mesma regiao. Joaozinho conseguiu ainda a informaçao dos pontos
de início e fim da regiao percorrida por cada um dos sorveteiros.

Com base nestes dados, Joaozinho quer descobrir os locais da praia onde o pai dele deve parar o carro,
de forma que pelo menos um sorveteiro passe naquele local. Só que o volume de dados é muito
grande, e Joaozinho está pensando se seria possível utilizar o computador para ajudá-lo nesta tarefa.
No entanto Joaozinho nao sabe programar, e está pedindo a sua ajuda.

Tarefa
Voce deve escrever um programa que leia os dados obtidos pelo Joaozinho e imprima uma lista de
intervalos da praia por onde passa pelo menos um sorveteiro.

Entrada
Seu programa deve ler vários conjuntos de teste. A primeira linha de um conjunto de teste contém dois
inteiros nao negativos, P e S, que indicam respectivamente o comprimento em metros da praia e o
número de sorveteiros. Seguem-se S linhas, cada uma contendo dois números inteiros U e V que
descrevem o intervalo de trabalho de cada um dos sorveteiros, em metros contados a partir do início da
praia (U < V, 0 <= U <= P e 0 <= V <= P). O final da entrada é indicado por S = 0 e P
= 0.
Exemplo de Entrada
200 2
0 21
110 180
1000 3
10 400
80 200
400 1000
10 2
1 4
5 6
0 0

1
Saída
Para cada conjunto de teste da entrada seu programa deve produzir uma lista dos intervalos da praia
que sao servidos por pelo menos um sorveteiro. A lista deve ser precedida de uma linha que identifica
o conjunto de teste, no formato "Teste n", onde n é numerado a partir de 1. Cada intervalo da lista
deve aparecer em uma linha separada, sendo descrito por dois números inteiros U e V, representando
respectivamente o início e o final do intervalo (U <V). O final da lista de intervalos deve ser indicado
por uma linha em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida
rigorosamente.
Exemplo de Saída
Teste 1
0 21
110 180

Teste 2
10 1000

Teste 3
1 4
5 6

(esta saída corresponde ao exemplo de entrada acima)

Restriçoes
0 <= P <= 10000 (P = 0 apenas para indicar o final da entrada)
> 0 <= S <= 5000 (S = 0 apenas para indicar o final da entrada)
> 0 <= U <V <= P

Added by: Wanderley Guimaraes


Date: 2007-02-24
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2001

2
SPOJ Problem Set (obi)

1334. Calculando
Problem code: CALCULA
A disseminaçao dos computadores se deve principalmente a capacidade de eles se comportarem como
outras máquinas, vindo a substituir muitas destas. Esta flexibilidade é possível porque podemos alterar
a funcionalidade de um computador, de modo que ele opere da forma que desejarmos: essa é a base do
que chamamos programaçao.

Tarefa
Sua tarefa é escrever um programa que faça com que o computador opere como uma calculadora
simples. O seu programa deve ler expressoes aritméticas e produzir como saída o valor dessas
expressoes, como uma calculadora faria. O programa deve implementar apenas um subconjunto
reduzido das operaçoes disponíveis em uma calculadora: somas e subtraçoes.

Entrada
A entrada é composta de vários conjuntos de testes. A primeira linha de um conjunto de testes contém
um número inteiro m (1 <= m <= 100), indicando o número de operandos da expressao a ser
avaliada. A segunda linha de um conjunto de testes contém a expressao aritmética a ser avaliada, no
seguinte formato:

X 1 s 1 X 2 s 2 ... X m-1 s m-1 X m

onde

X i , 1 <= i <= m, é um operando (0 <= X i <= 100);


s j , 1 <= j <m, é um operador, representado pelos símbolos ’+’ ou ’-’;
nao há espaços em branco entre operandos e operadores.

O final da entrada é indicado pelo valor m = 0.


Exemplo de Entrada
3
3+7-22
3
5-10-77
10
1+2+3+4+5+6+7+8+9+10
0

Saída
Para cada conjunto de testes da entrada seu programa deve produzir tres linhas. A primeira linha deve
conter um identificador da expressao, no formato "Teste n", onde n é numerado a partir de 1. Na
segunda linha deve aparecer o resultado encontrado pelo seu programa. A terceira linha deve ser
deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

1
Exemplo de Saída
Teste 1
-12

Teste 2
-82

Teste 3
55

(esta saída corresponde ao exemplo de entrada acima)

Restriçoes
1 <= m <= 100
> 0 <= X i<sub> <= 100 para todo 1 <= i <= m

Added by: Wanderley Guimaraes


Date: 2007-02-24
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2001

2
SPOJ Problem Set (obi)

1363. Par ou ímpar


Problem code: PAR
Muitas crianças gostam de decidir todas as disputas através do famoso jogo de Par ou Ímpar. Nesse
jogo, um dos participantes escolhe Par e o outro Ímpar. Após a escolha, os dois jogadores mostram,
simultaneamente, uma certa quantidade de dedos de uma das maos. Se a soma dos dedos das maos dos
dois jogadores for par, vence o jogador que escolheu Par inicialmente, caso contrário vence o que
escolheu Ímpar.

Tarefa
Dada uma seqüencia de informaçoes sobre partidas de Par ou Ímpar (nomes dos jogadores e números
que os jogadores escolheram), voce deve escrever um programa para indicar o vencedor de cada uma
das partidas.

Entrada
A entrada é composta de vários conjuntos de testes. A primeira linha de um conjunto de testes contém
um inteiro N, que indica o número de partidas de Par ou Ímpar que aconteceram. As duas linhas
seguintes contem cada uma um nome de jogador. Um nome de jogador é uma cadeia de no mínimo um
e no máximo dez letras (maiúsculas e minúsculas), sem espaços em branco. As N linhas seguintes
contem cada uma dois inteiros A e B que representam o número de dedos que cada jogador mostrou
em cada partida (0 <= A <= 5 e 0 <= B <= 5). Em todas as partidas, o primeiro jogador sempre
escolhe Par. O final da entrada é indicado por N = 0.
Exemplo de entrada
3
Pedro
Paulo
2 4
3 5
1 0
2
Claudio
Carlos
1 5
2 3
0

Saída
Para cada conjunto de teste da entrada, seu programa deve produzir a saída da seguinte forma. A
primeira linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é
numerado seqüencialmente a partir de 1. As próximas N linhas devem indicar o nome do vencedor de
cada partida. A próxima linha deve ser deixada em branco. A grafia mostrada no Exemplo de 3 Saída,
abaixo, deve ser seguida rigorosamente.

1
Exemplo de Saída
Teste 1
Pedro
Pedro
Paulo

Teste 2
Claudio
Carlos

(esta saída corresponde ao exemplo de entrada acima)

Restriçoes
0 <= N <= 1000 (N = 0 apenas para indicar o fim da entrada)
> 0 <= A <= 5<code>
> 0 <= B <= 5<code>
> 1 <= comprimento do nome de jogador <= 10<code>

Added by: Wanderley Guimaraes


Date: 2007-03-07
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2004

2
SPOJ Problem Set (obi)

1364. Cubra os furos


Problem code: FUROS
Uma placa de aço retangular contém N furos circulares de 5 mm de diâmetro, localizados em pontos
distintos, nao sobrepostos -- ou seja, o centro de cada furo está a uma distância maior ou igual a 5 mm
do centro de todos os outros furos.

Uma peça de forma circular, tendo em seu centro um eixo de 5 mm de diâmetro, deve ser colocada
sobre a placa, de modo que o eixo encaixe-se em um de seus furos.

[IMAGE] [IMAGE]

Tarefa
Voce deve escrever um programa para determinar o diâmetro mínimo que a peça deve ter de tal forma
que, com seu eixo encaixado em um dos furos da placa, a parte circular cubra completamente todos os
outros furos da placa.

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de teste contém
um inteiro N, que indica o número de furos na placa de aço (1 <= N <= 1000). As N linhas
seguintes contem cada uma dois inteiros X e Y , separados por um espaço em branco, que descrevem a
posiçao do centro de um furo (-10000 <= X <= 10000 e -10000 <= Y <= 10000). A
unidade de medida das coordenadas dos furos é 1 mm. O final da entrada é indicado por N = 0.
Exemplo de Entrada
3
20 25
10 5
10 10
3
0 5
10 0
0 10
0

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado
seqüencialmente a partir de 1. A segunda linha deve conter o diâmetro mínimo que a peça deve ter,
como um número inteiro. A terceira linha em deve ser deixada em branco. A grafia mostrada no
Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

1
Exemplo de Saída
Teste 1
42

Teste 2
28

(esta saída corresponde ao exemplo de entrada acima)

Restriçoes
0 <= N <= 1000 (N = 0 apenas para indicar o fim da entrada)
> -10000 <= X <= 10000<code>
> -10000 <= Y <= 10000<code>

Added by: Wanderley Guimaraes


Date: 2007-03-07
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2004

2
SPOJ Problem Set (obi)

1365. Palíndrome
Problem code: PAL
Uma cadeia de caracteres é chamada de palíndrome se seqüencia de caracteres da esquerda para a
direita é igual a seqüencia de caracteres da direita para a esquerda (uma outra definiçao é que o
primeiro caractere da cadeia deve ser igual ao último caractere, o segundo caractere seja igual ao
penúltimo caractere, o terceiro caractere seja igual ao antepenúltimo caractere, e assim por diante). Por
exemplo, as cadeias de caracteres ’mim’, ’axxa’ e ’ananaganana’ sao exemplos de palíndromes.

Se uma cadeia nao é palíndrome, ela pode ser dividida em cadeias menores que sao palíndromes. Por
exemplo, a cadeia ’aaxyx’ pode ser dividida de quatro maneiras distintas, todas elas contendo apenas
cadeias palíndromes: {’aa’, ’xyx’}, {’aa’, ’x’, ’y’, ’x’}, {’a’, ’a’, ’xyx’} e {’a’, ’a’, ’x’, ’y’, ’x’}.

Tarefa
Escreva um programa que determine qual o menor número de partes em que uma cadeia deve ser
dividida de forma que todas as partes sejam palíndromes.

Entrada
A entrada é constituída de vários conjuntos de teste. A primeira linha de um conjunto de testes contém
um inteiro N que indica o número de caracteres da cadeia (1 <= N <= 2000). A segunda linha contém a
cadeia de caracteres, composta por letras minúsculas (de ’a’ a ’z’), sem espaços em branco. O final da
entrada é indicado por N = 0.
Exemplo de Entrada
3
axa
6
xyzyyx
10
bbabcbbaab
0

Saída
Para cada conjunto de teste da entrada seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado a
partir de 1. A segunda linha deve conter um inteiro indicando o menor número de partes que a cadeia
de entrada deve ser dividida de forma que todas as partes sejam palíndromes. A terceira linha deve ser
deixada em branco. O formato mostrado no exemplo de saída abaixo deve ser seguido rigorosamente.

1
Exemplo de Saída
Teste 1
1

Teste 2
4

Teste 3
4

(esta saída corresponde ao exemplo de entrada acima)

Restriçoes
0 <= N <= 2000 (N = 0 apenas para indicar o fim da entrada)

Added by: Wanderley Guimaraes


Date: 2007-03-07
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2004

2
SPOJ Problem Set (obi)

1366. TV da Vovó
Problem code: TV
A vovó tem um televisor muito antigo, que ultimamente está exibindo um defeito incômodo: a imagem
aparece ’deslocada’ (para cima ou para baixo, para o lado direito ou para o lado esquerdo). Quando a
imagem está deslocada para cima, a parte da imagem que deixa de ser vista na parte superior reaparece
na parte de baixo da tela. Da mesma forma, quando a imagem está deslocada a direita, a parte da
imagem que deixa de ser vista a direita reaparece na tela do lado esquerdo.

[IMAGE]

A imagem do televisor pode ser vista como uma matriz de pontos organizados em linhas e colunas.
Para consertar o televisor da vovó, voce pode ajustar a imagem introduzindo uma série de ’comandos
de correçao’ em um painel de ajuste. Cada comando de correçao desloca a imagem de um certo
número de linhas (para cima ou para baixo) e um certo número de colunas (para a direita ou para a
esquerda).

Tarefa
Dada uma matriz que representa uma imagem defeituosa e uma série de comandos de correçao, seu
programa deve calcular a matriz que representa a imagem resultante após todos os comandos terem
sido aplicados sequencialmente.

Entrada
A entrada possui vários conjuntos de teste. Cada conjunto de teste inicia com a descriçao da matriz que
representa a imagem do televisor. A primeira linha contém dois inteiros M e N representando o
número de linhas e o número de colunas da matriz (1 <= M <= 1000 e 1 <= N <= 1000). As
M linhas seguintes da entrada contém cada uma N inteiros, descrevendo o valor de cada ponto da
imagem. Após a descriçao da imagem, segue-se a descriçao dos comandos de correçao. Cada comando
de correçao é descrito em uma linha contendo dois inteiros X e Y. O valor de X representa o
deslocamento na direçao horizontal (valor positivo representa deslocamento para a direita, valor
negativo para a esquerda), e o valor de Y representa o deslocamento da direçao vertical (valor positivo
para cima, valor negativo para baixo). O final da lista de comandos é indicado por X = Y = 0, e o
final da entrada é indicado por M = N = 0.
Exemplo de Entrada
3 3
1 2 3
4 5 6
7 8 9
1 0
1 -1
0 0
3 4
6 7 8 5
10 11 12 9

1
2 3 4 1
-3 2
0 0
0 0

Saída
Para cada conjunto de teste, o seu programa deve produzir uma imagem na saída. A primeira linha da
saída deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado
seqüencialmente a partir de 1. A seguir deve aparecer a matriz que representa a imagem resultante, no
mesmo formato da imagem de entrada. Ou seja, as N linhas seguintes devem conter cada uma M
inteiros que representam os pixels da imagem. Após a imagem deixe uma linha em branco. A grafia
mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.
Exemplo de Saída
Teste 1
8 9 7
2 3 1
5 6 4

Teste 2
1 2 3 4
5 6 7 8
9 10 11 12

(esta saída corresponde ao exemplo de entrada acima)

Restricoes
0 <= N <= 1000 (N = 0 apenas para indicar o final da entrada)
> 0 <= M <= 1000<code> (M = 0 apenas para indicar o final da entrada)
> 0 <= X <= 1000<code>
> 0 <= Y <= 1000<code>
> 0 <= número de comandos de correçao em cada conjunto de teste <=
1000<code>

Added by: Wanderley Guimaraes


Date: 2007-03-07
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2004

2
SPOJ Problem Set (obi)

1367. Proteja sua senha


Problem code: SENHA
Por questoes de segurança, muitos bancos hoje em dia estao alterando a forma como seus clientes
digitam as senhas nos caixas eletrônicos, pois alguém pode postar-se atrás do cliente e ver as teclas a
medida em que ele as digita.

Uma alternativa bastante utilizada tem sido associar os dez dígitos a cinco letras, de forma que cada
letra esteja associada a dois dígitos, conforme o exemplo abaixo:
___ ___ ___ ___ ___ ___ ___ ___ ___ ___
| | | | | | | | | | | | | | |
| | 1 | | | 3 | | | 0 | | | 5 | | | 2 |
| | | | | | | | | | | | | | |
| A |---| | B |---| | C |---| | D |---| | E |---|
| | | | | | | | | | | | | | |
| | 7 | | | 9 | | | 8 | | | 6 | | | 4 |
|___|___| |___|___| |___|___| |___|___| |___|___|

As associaçoes entre números e letras sao mostradas como botoes numa tela sensível ao toque,
permitindo que o cliente selecione os botoes correspondentes a senha. Considerando a disposiçao dos
botoes da figura acima, a senha 384729 seria digitada como BCEAEB (note que a mesma seqüencia de
letras seria digitada para outras senhas, como por exemplo 982123). Cada vez que o cliente usa o caixa
eletrônico, as letras utilizadas sao as mesmas (de ’A’ a ’E’), com os botoes nas mesmas posiçoes, mas
os dígitos sao trocados de lugar. Assim, caso um intruso veja (mesmo que mais de uma vez) a
seqüencia de letras digitada, nao é possível notar facilmente qual a senha do cliente do banco.

Tarefa
Dada uma seqüencia de associaçoes entre letras e números, e as letras digitadas pelo cliente do banco
para cada uma dessas associaçoes, voce deve escrever um programa para determinar qual é a senha do
cliente.

Entrada
A entrada é composta de vários conjuntos de testes. A primeira linha de um conjunto de testes contém
um inteiro N, que indica o número de associaçoes entre letras e números e as senhas digitadas (2 <=
N <= 10). As N linhas seguintes contem as entradas da seguinte forma: 10 dígitos, em ordem de
associaçao, para as letras de ’A’ a ’E’ (2 dígitos para a letra A, 2 para a B e assim sucessivamente) e 6
letras que representam a senha codificada conforme os dígitos anteriores. As N associaçoes fornecidas
em um conjunto de testes serao sempre suficientes para definir univocamente a senha do cliente. O
final da entrada é indicado por N = 0.

1
Exemplo de Entrada
2
1 7 3 9 0 8 5 6 2 4 B C E A E B
9 0 7 5 8 4 6 2 3 1 E C C B D A
3
0 1 2 3 4 5 6 7 8 9 B C D D E E
1 3 5 4 6 8 7 9 0 2 E B C D C D
3 2 0 4 5 9 7 6 8 1 A C D D E C
0

Saída
Para cada conjunto de teste da entrada, seu programa deve produzir tres linhas na saída. A primeira
linha deve conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado
seqüencialmente a partir de 1. A segunda linha deve conter a senha do cliente, com um espaço após
cada dígito. A terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de Saída,
abaixo, deve ser seguida rigorosamente.
Exemplo de Saída
Teste 1
3 8 4 7 2 9

Teste 2
2 5 6 7 8 9

(esta saída corresponde ao exemplo de entrada acima)

Restriçoes
2 <= N <= 10 (N = 0 apenas para indicar o fim da entrada)

Added by: Wanderley Guimaraes


Date: 2007-03-07
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2004

2
SPOJ Problem Set (obi)

1368. Orkut
Problem code: ORKUT
Larissa acaba de entrar para o Orkut, um site na internet que permite que as pessoas se reúnam em
comunidades e grupos de amigos. Como ela acabou de se registrar, ela ainda nao possui muitos amigos
na sua lista de contatos. Após fazer uma pesquisa, ela descobriu que os seus antigos amigos de escola
(que adoravam mexer com computadores) também fazem parte do Orkut. Larissa entao decidiu
chamá-los para serem seus amigos virtuais. Porém, eles resolveram brincar com a Larissa, e cada um
deles só vai aceitar o pedido de Larissa quando ela já for amiga virtual de alguns dos outros amigos do
grupo. Assim, para conseguir ter todos os seus antigos amigos de escola na sua lista de amigos do
Orkut, ela deve cumprir as exigencias de cada um deles.

Tarefa
Larissa acha que pode encontrar uma seqüencia de nomes dos amigos, de modo que se ela pedir a cada
um deles para ser sua amiga no Orkut, obedecendo a seqüencia, todas as exigencias serao cumpridas e
todos eles irao aceitar o seu pedido. Larissa precisa da sua ajuda para resolver esse problema de forma
rápida. A sua tarefa é escrever um programa para encontrar uma seqüencia de nomes que resolva o
problema, ou dizer que nao é possível encontrar tal seqüencia.

Entrada
A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de teste contém
um inteiro N que indica o número de antigos amigos da Larissa (1 <= N <= 30). A linha seguinte
irá conter N nomes de amigos, separados por espaço em branco. Cada nome nao terá mais de 15 letras,
e serao todos distintos. Nas próximas N linhas serao indicadas as exigencias que a Larissa deve
cumprir. Cada linha descreve a exigencia de um amigo e começará com o nome desse amigo, seguido
de um número M (0 <= M <= N - 1), que indica o número de pessoas que aquele amigo quer que
a Larissa seja amiga antes, e seguido pelos M nomes de amigos (cada item na linha separado por
espaço em branco). O final da entrada é indicado por N = 0.
Exemplo de Entrada
5
Joao Maria Tadeu Jose Ricardo
Joao 2 Maria Ricardo
Maria 1 Tadeu
Jose 1 Joao
Tadeu 0
Ricardo 0
3
Joao Maria Renata
Maria 1 Joao
Joao 1 Renata
Renata 1 Maria
0

1
Saída
Para cada conjunto de teste seu programa deve produzir tres linhas na saída. A primeira linha deverá
conter um identificador do conjunto de teste, no formato "Teste n", onde n é numerado
seqüencialmente a partir de 1. A segunda linha deve conter a seqüencia de nomes de amigos (cada
nome seguido de um espaço em branco) que resolve o problema da Larissa, ou a palavra "impossivel",
quando nao houver uma seqüencia possível (note a ausencia de acentuaçao). Se existir mais de uma
seqüencia de amigos que resolve o problema, imprima qualquer uma delas (mas apenas uma). A
terceira linha deverá ser deixada em branco. A grafia mostrada no Exemplo de Saída abaixo deverá ser
seguida rigorosamente.
Exemplo de Saída
Teste 1
Ricardo Tadeu Maria Joao Jose

Teste 2
impossivel

(esta saída corresponde ao exemplo de entrada acima)

Restriçoes
0 <= N <= 30 (N = 0 apenas para indicar o fim da entrada)
> 0 <= M <= N - 1<code>
> Cada nome de amigo terá no máximo 15 letras<p>

Added by: Wanderley Guimaraes


Date: 2007-03-07
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2004

2
SPOJ Problem Set (obi)

1387. Transmissao de Energia


Problem code: ENERGIA
A distribuiçao de energia para as diversas regioes do país exige um investimento muito grande em
linhas de transmissao e estaçoes transformadoras. Uma linha de transmissao interliga duas estaçoes
transformadoras. Uma estaçao transformadora pode estar interligada a uma ou mais outras estaçoes
transformadoras, mas devido ao alto custo nao pode haver mais de uma linha de transmissao
interligando duas estaçoes.

As estaçoes transformadoras sao interconectadas de forma a garantir que a energia possa ser
distribuída entre qualquer par de estaçoes. Uma rota de energia entre duas estaçoes e 1 e e k é
definida como uma sequencia (e 1 , l 1 , e 2 , l 2 , ...e k-1 , l k-1 , e k ) onde
cada e i é uma estaçao transformadora e cada l i é uma linha de transmissao que conecta e i e i+1 .

Os engenheiros de manutençao do sistema de transmissao de energia consideram que o sistema está


em estado normal se há pelo menos uma rota entre qualquer par de estaçoes, e em estado de falha caso
contrário.

Um grande tornado passou pelo país danificando algumas das linhas de transmissao, e os engenheiros
de manutençao do sistema de transmissao de energia necessitam de sua ajuda.

Tarefa
Dada a configuraçao atual do sistema de transmissao de energia, descrevendo as interconexoes
existentes entre as estaçoes, escreva um programa que determine o estado do sistema.

Entrada
A entrada é composta de vários casos de teste. A primeira linha de um caso de teste contém dois
números inteiros E e L indicando respectivamente o número de estaçoes (3 <= E <= 100) e o
número de linhas de transmissao do sistema (E - 1 <= L <= E × (E - 1)/2) que
continuam em funcionamento após o tornado. As estaçoes sao identificadas por números de 1 a E.
Cada uma das L linhas seguintes contém dois inteiros X e Y que indicam que existe uma linha de
transmissao interligando a estaçao X a estaçao Y. O final da entrada é indicado por E = L = 0.

A entrada deve ser lida do dispositivo de entrada padrao.

Saída
Para cada caso de teste seu programa deve produzir tres linhas na saída. A primeira identifica o
conjunto de teste no formato "Teste n", onde n é numerado a partir de 1. A segunda linha deve conter a
palavra "normal", se, para cada par de estaçoes, houver uma rota que as conecte, e a palavra "falha"
caso nao haja uma rota entre algum par de estaçoes. A terceira linha deve ser deixada em branco. A
grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida rigorosamente.

1
A saída deve ser escrita no dispositivo de saída padrao.

Exemplos
Entrada:
6 7
1 2
2 3
3 4
4 5
5 6
6 2
1 5
4 3
1 2
4 2
1 4
0 0

Saida:
Teste 1
normal

Teste 2
falha

Restriçoes
3 <= E <= 100
E - 1 <= L <= E × (E - 1)/2

Added by: Wanderley Guimaraes


Date: 2007-03-09
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2005 Programacao Nivel 2

2
SPOJ Problem Set (obi)

1388. Vivo ou Morto


Problem code: VIVO
Toda criança certamente já brincou de "vivo ou morto". A brincadeira é dirigida por um "chefe" (um
adulto), que comanda dois ou mais participantes (crianças). A brincadeira é composta de rodadas. No
início, os participantes sao organizados pelo chefe em fila única. A cada rodada o chefe grita "vivo" ou
"morto" e todos os participantes tentam seguir sua ordem, levantando-se ao ouvir a palavra "vivo" ou
abaixando-se ao ouvir a palavra "morto". Um participante que nao segue a ordem do chefe é
eliminado, deixando o seu lugar na fila. Os participantes remanescentes agrupam-se novamente em fila
única, preenchendo as posiçoes dos participantes eliminados, mas mantendo suas posiçoes relativas. O
jogo continua até que uma rodada seja composta por exatamente um participante. Tal participante é
dito o vencedor do jogo.

Por exemplo, considere que a brincadeira inicie com cinco participantes, identificados por números
inteiros de 1 a 5, e que o chefe organize a fila na ordem 3 -> 2 -> 1 -> 4 -> 5. Se na primeira rodada
forem eliminados os participantes 2 e 4, a fila da segunda rodada será formada por 3 -> 1 -> 5; se na
segunda rodada for eliminado o participante 1, a fila da terceira rodada será formada por 3 -> 5. Se na
terceira rodada o participante 3 for eliminado, o vencedor da brincadeira será o participante 5.

Tarefa
Sua tarefa é escrever um programa que determine o vencedor de uma partida de "vivo ou morto", a
partir da informaçao das ordens dadas pelo chefe e das açoes executadas pelos participantes em cada
rodada.

Entrada
A entrada é constituída de vários casos de teste, cada um representando uma partida. A primeira linha
de um caso de teste contém dois números inteiros P e R indicando respectivamente a quantidade inicial
de participantes (2 <= P <= 100) e quantidade de rodadas da partida (1 <= R <= 100). Os participantes
sao identificados por números de 1 a P. A segunda linha de um caso de teste descreve a fila organizada
pelo chefe, contendo P números inteiros distintos x1, x2, . . . xP , onde x1 representa o identificador do
participante no primeiro lugar na fila, x2 representa o identificador do participante no segundo lugar na
fila, e assim por diante (1 <= xi <= P). Cada uma das R linhas seguintes representa uma rodada,
contendo um número inteiro inteiro N indicando o número de participantes da rodada (2 <= N <=
P), um número inteiro inteiro J representando a ordem dada pelo chefe (0 <= J <= 1) e N números
inteiros Ai representando a açao do participante colocado na i-ésima posiçao na fila (0 <= Ai <=
1). Ordens e açoes "vivo" sao representadas pelo valor 1, ordens e açoes "morto" pelo valor zero. Cada
partida tem exatamente um vencedor, determinado somente na última rodada fornecida no caso de
teste correspondente. O final da entrada é indicado por P = R = 0.

1
Saída
Para cada caso de teste seu programa deve produzir tres linhas. A primeira identifica o conjunto de
teste no formato "Teste n", onde n é numerado a partir de 1. A segunda linha deve conter o
identificador do vencedor. A terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo
de Saída, abaixo, deve ser seguida rigorosamente.

Exemplo
Entrada:
2 2
2 1
2 1 1 1
2 1 1 0
5 4
3 2 1 4 5
5 1 1 1 1 1 1
5 0 0 1 0 1 0
3 0 0 1 0
2 1 0 1
0 0

Saída:
Teste 1
2
Teste 2
5

Restriçoes
2 <= P <= 100 (P = 0 apenas para indicar o fim da entrada)
1 <= R <= 100 (R = 0 apenas para indicar o fim da entrada)
1 <= xi <= P, para 1 <= i <= P
2 <= N <= P
0 <= J <= 1
0 <= Ai <= 1, para 1 <= i <= N

Added by: Wanderley Guimaraes


Date: 2007-03-09
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpiada Brasileira de Informatica 2005 Programacao Nivel 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

1389. Pedido de Desculpas


Problem code: DESCULPA
Cuca saiu para jogar futebol com os amigos e esqueceu do encontro que tinha com a namorada. Ciente
da mancada, Cuca deseja elaborar um pedido especial de desculpas. Resolveu entao enviar flores e
usar o cartao da floricultura para escrever um pedido especial de desculpas.

Cuca buscou na internet um conjunto de frases bonitas contendo a palavra ‘desculpe’ (que pode
ocorrer mais de uma vez na mesma frase). No entanto, o cartao da floricultura é pequeno, e nem todas
as frases que Cuca colecionou poderao ser aproveitadas.

Cuca quer aproveitar o espaço do cartao, onde cabe um número limitado de caracteres, para escrever
um sub-conjunto das frases coletadas de modo que apareça o máximo de vezes possível a palavra
‘desculpe’.

Tarefa
Escreva um programa que, dados o número de caracteres que cabem no cartao e a quantidade de frases
coletadas (com os respectivos comprimentos e os números de ocorrencias da palavra ‘desculpe’),
determine o número máximo de vezes que a palavra aparece, utilizando apenas as frases colecionadas,
sem repetí-las.

Entrada
A entrada é constituída de vários casos de teste. A primeira linha de um caso de teste contém dois
números inteiros C e F indicando respectivamente o comprimento do cartao em caracteres (8 <= C
<= 1000) e o número de frases coletadas (1 <= F <= 50). Cada uma das F linhas seguintes
descreve uma frase coletada. A descriçao é composta por dois inteiros N e D que indicam
respectivamente o número de caracteres na frase (8 <= N <= 200) e quantas vezes a palavra
‘desculpe’ ocorre na frase (1 <= D <= 25). O final da entrada é indicado por C = F = 0.

Saída
Para cada caso de teste seu programa deve produzir tres linhas na saída. A primeira identifica o
conjunto de teste no formato "Teste n", onde n é numerado a partir de 1. A segunda linha deve conter o
máximo número de vezes que a palavra ‘desculpe’ pode aparecer no cartao, considerando que apenas
frases coletadas podem ser utilizadas, e cada frase nao é utilizada mais de uma vez. A terceira linha
deve ser deixada em branco. A grafia mostrada no Exemplo de Saída, abaixo, deve ser seguida
rigorosamente.

1
Exemplo
Entrada:
200 4
100 4
100 1
120 2
80 5
40 3
10 1
10 1
20 2
0 0

Saída:
Teste 1
9

Teste 2
4

Restriçoes
8 <= C <= 1000 (C = 0 apenas para indicar o fim da entrada)
1 <= F <= 50 (S = 0 apenas para indicar o fim da entrada)
8 <= N <= 200
1 <= D <= 25

Added by: Wanderley Guimarăes


Date: 2007-03-09
Time limit: 1s
Source
50000B
limit:
Cluster: Pyramid (Intel Pentium III 733 MHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: Olimpiada Brasileira de Informatica 2005 Programacao Nivel 2

2
SPOJ Problem Set (obi)

1390. Mini-Poker
Problem code: OBIPOKER
Mini-Poker é o nome de um jogo de cartas que é uma simplificaçao de Poker, um dos mais famosos
jogos de cartas do mundo. Mini-Poker é jogado com um baralho normal de 52 cartas, com quatro
naipes (copas, paus, espadas e ouro), cada naipe compreendendo treze cartas (Ás, 2, 3, 4, 5, 6, 7, 8, 9,
10, Valete, Dama, Rei).

No início do jogo, cada jogador recebe cinco cartas. O conjunto de cinco cartas vale um certo número
de pontos, de acordo com as regras descritas abaixo. Diferentemente do jogo de Poker normal, em
Mini-Poker o naipe das cartas é desconsiderado. Assim, para simplificar a descriçao do jogo, vamos
utilizar os números de 1 a 13 para identificar as cartas do baralho, na ordem dada acima. Uma outra
diferença é que pode ocorrer empate entre mais de um vencedor; nesse caso os vencedores dividem o
premio.

As regras para pontuaçao em Mini-Poker sao as seguintes:

1. Se as cinco cartas estao em seqüencia a partir da carta x (ou seja, os valores das cartas sao x, x+1,
x+2, x+3 e x+4), a pontuaçao é x+200 pontos. Por exemplo, se as cartas recebidas sao 10, 9, 8, 11 e
12, a pontuaçao é 208 pontos.

2. Se há quatro cartas iguais x (uma quadra, ou seja, os valores das cartas sao x, x, x, x e y), a
pontuaçao é x+180 pontos. Por exemplo, se as cartas recebidas sao 1, 1, 1, 10 e 1, a pontuaçao é 181
pontos.

3. Se há tres cartas iguais x e duas outras cartas iguais y (uma trinca e um par, ou seja, os valores das
cartas sao x, x, x, y e y), a pontuaçao é x + 160 pontos. Por exemplo, se as cartas recebidas sao 10, 4,
4, 10 e 4, a pontuaçao é 164 pontos.

4. Se há tres cartas iguais x e duas outras cartas diferentes y e z (uma trinca, ou seja, os valores das
cartas sao x, x, x, y e z), a pontuaçao é x + 140 pontos. Por exemplo, se as cartas recebidas sao 2, 3, 2,
2 e 13, a pontuaçao é 142 pontos.

5. Se há duas cartas iguais x, duas outras cartas iguais y (x != y) e uma outra carta distinta z (dois
pares, ou seja, os valores das cartas sao x, x, y, y e z), a pontuaçao é 3 × x + 2 × y + 20
pontos, em que x > y. Por exemplo, se as cartas recebidas sao 12, 7, 12, 8 e 7, a pontuaçao é 70 pontos.

6. Se há apenas duas cartas iguais x e as outras sao todas distintas (um par, ou seja, os valores das
cartas sao x, x, y, z e t), a pontuaçao é x pontos. Por exemplo, se as cartas recebidas sao 12, 13, 5, 8 e
13, a pontuaçao é 13 pontos.

7. Se todas as cartas sao distintas, nao há pontuaçao.

1
Tafefa
Escreva um programa que, fornecidas as cartas dadas a um jogador, calcule pontuaçao do jogador
naquela jogada.

Entrada
A entrada é composta por vários casos de teste, cada um correspondendo a uma jogada. A primeira
linha da entrada contém um inteiro N que indica o número de casos de teste (1 <= N <= 100). Cada
uma das N linhas seguintes contém cinco números inteiros C1,C2,C3,C4 e C5, representando as cinco
cartas recebidas por um jogador (1 <= C1,C2,C3,C4,C5 <= 13).

Saída
Para cada caso de teste da entrada, seu programa deve produzir tres linhas na saída. A primeira linha
deve conter um identificador do caso de teste, no formato "Teste n", onde n é numerado
seqüencialmente a partir de 1. A segunda linha deve conter a pontuaçao do jogador considerando as
cinco cartas recebidas. A terceira linha deve ser deixada em branco. A grafia mostrada no Exemplo de
Saída, abaixo, deve ser seguida rigorosamente.

Exemplo
Entrada:
2
12 3 10 3 12
1 2 3 5 4

Saída:
Teste 1
62

Teste 2
201

Restriçoes
1 <= N <= 100
1 <= C1,C2,C3,C4,C5 <= 13

Added by: Wanderley Guimaraes


Date: 2007-03-09
Time limit: 1s
Source limit:50000B
Languages: All
Resource: OBI 2005 Programaçao Nível 2

2
SPOJ Problem Set (obi)

2606. Frota de Táxi


Problem code: FROTATAX
A Companhia de Táxi Tabajara (CTT) é uma das maiores empresas de transporte do país. Possui uma
vasta frota de carros e opera em todas as grandes cidades. Recentemente a CTT modernizou a sua
frota, adquirindo um lote de 500 carros bi-combustíveis (carros que podem utilizar como combustível
tanto álcool quanto gasolina). Além do maior conforto para os passageiros e o menor gasto com
manutençao, com os novos carros é possível uma reduçao adicional de custo: como o preço da
gasolina está sujeito a variaçoes muito bruscas e pode ser vantagem, em certos momentos, utilizar
álcool como combustível. Entretanto, os carros possuem um melhor desempenho utilizando gasolina,
ou seja, em geral, um carro percorre mais quilômetros por litro de gasolina do que por litro de álcool.

Tarefa
Voce deve escrever um programa que, dados o preço do litro de álcool, o preço do litro de gasolina e
os quilômetros por litro que um carro bi-combustível realiza com cada um desses combustíveis,
determine se é mais econômico abastecer os carros da CTT com álcool ou com gasolina. No caso de
nao haver diferença de custo entre abastecer com álcool ou gasolina a CTT prefere utilizar gasolina.

Entrada
A entrada é composta por uma linha contendo quatro números reais com precisao de duas casas
decimais A, G, Ra e Rg , representando respectivamente o preço por litro do álcool, o preço por litro
da gasolina, o rendimento (km/l) do carro utilizando álcool e o rendimento (km/l) do carro utilizando
gasolina.

Saída
A saída deve ser composta por uma única linha contendo o caractere ‘A’ se é mais econômico
abastecer a frota com álcool ou o caractere ‘G’ se é mais econômico ou indiferente abastecer a frota
com gasolina.

Exemplo 1 Exemplo 2 Exemplo 3


Entrada: Entrada: Entrada:
1.20 2.30 10.00 15.00 1.00 1.00 9.00 9.01 1.00 1.00 11.00 11.00

Saída: Saída: Saída:


A G G

Restriçoes
0.01 <= A <= 10.00
0.01 <= G <= 10.00
0.01 <= Ra <= 20.00

1
0.01 <= Rg <= 20.00

Added by: Wanderley Guimaraes


Date: 2008-04-02
Time limit: 1s-10s
Source limit:50000B
Languages: All
Resource: Olimpíada Brasileira de Informática 2005 -- Programaçao Nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

2607. Campo de Minhocas


Problem code: MINHOCA
Minhocas sao muito importantes para a agricultura e como insumo para produçao de raçao animal. A
Organizaçao para Bioengenharia de Minhocas (OBM) é uma entidade nao governamental que
promove o aumento da produçao, utilizaçao e exportaçao de minhocas.

Uma das atividades promovidas pela OBM é a manutençao de uma fazenda experimental para
pesquisa de novas tecnologias de criaçao de minhocas. Na fazenda, a área destinada as pesquisas é de
formato retangular, dividida em células quadrangulares de mesmo tamanho. As células sao utilizadas
para testar os efeitos, na produçao de minhocas, de variaçoes de espécies de minhocas, tipos de terra,
de adubo, de tratamento, etc. Os pesquisadores da OBM mantem um acompanhamento constante do
desenvolvimento das minhocas em cada célula, e tem uma estimativa extremamente precisa da
produtividade em cada uma das células. A figura abaixo mostra um mapa da fazenda, mostrando a
produtividade estimada de cada uma das células.

Um pesquisador da OBM inventou e construiu uma máquina colhedeira de minhocas, e quer testá- la
na fazenda. A máquina tem a largura de uma célula, e em uma passada pelo terreno de uma célula
colhe todas as minhocas dessa célula, separando-as, limpando-as e empacotando-as. Ou seja, a
máquina eliminara uma das etapas mais intensivas de mao de obra no processo de produçao de
minhocas. A máquina, porém, ainda está em desenvolvimento e tem uma restriçao: nao faz curvas,
podendo movimentar-se somente em linha reta.

Decidiu-se entao que seria efetuado um teste com a máquina, de forma a colher o maior número
possível de minhocas em uma unica passada, em linha reta, de lado a lado do campo de minhocas. Ou
seja, a máquina deve colher todas as minhocas de uma ‘coluna’ ou de uma ‘linha’ de células do campo
de minhocas (a linha ou coluna cuja soma das produtividades esperadas das células é a maior
possível).

Tarefa
Escreva um programa que, fornecido o mapa do campo de minhocas, descrevendo a produtividade
estimada em cada célula, calcule o número esperado total de minhocas a serem colhidas pela máquina
durante o teste, conforme descrito acima.

1
Entrada
A primeira linha da entrada contém dois números inteiros N e M, representando respectivamente o
número de linhas (1 <= N <= 100) e o número de colunas (1 <= M <= 100) de células existentes no
campo experimental de minhocas. Cada uma das N linhas seguintes contém M inteiros, representando
as produtividades estimadas das células correspondentes a uma linha do campo de minhocas.

Saída
A saída deve ser composta por uma unica linha contendo um inteiro, indicando o número esperado
total de minhocas a serem colhidas pela máquina durante o teste.

Exemplo 1 Exemplo 2
Entrada:
Entrada:
4 1
3 4
100
81 28 240 10
110
40 10 100 240
0
20 180 110 35
100
Saída:
Saída:
450
310

Restriçoes

1 <= N <= 100


1 <= M <= 100
0 <= Produtividade de uma célula <= 500
0 <= Produtividade de uma linha ou coluna de células <= 50000

Added by: Wanderley Guimarăes


Date: 2008-04-02
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: Olimpíada Brasileira de Informática 2005 -- Programaçăo Nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

2608. Duende Perdido


Problem code: DUENDE
Gugo, o duende, ficou preso em uma caverna e precisa sair o mais rapidamente possível. A caverna é
formada por saloes interligados por túneis, na forma de uma grade retangular, com N linhas e M
colunas. Alguns dos saloes da caverna tem paredes de cristal. Duendes, como todos sabem, nao
gostam de ficar em ambientes com qualquer tipo de cristal, pois seus organismos entram em
ressonância com a estrutura de cristais, e em casos extremos os duendes podem até mesmo explodir.
Compreensivelmente, Gugo nao quer entrar em nenhum salao com parede de cristal.

A figura abaixo mostra uma caverna com quatro linhas e cinco colunas de saloes; os saloes cinza tem
paredes de cristal. A posiçao inicial de Gugo é indicada com um caractere ‘*’.

Tarefa
Voce deve escrever um programa que, dadas a configuraçao da caverna e a posiçao inicial de Gugo
dentro da caverna, calcule qual o número mínimo de saloes pelos quais o duende deve passar antes de
sair da caverna (nao contando o salao em que o duende está inicialmente), mas contando o salao que
tem saída para o exterior).

Entrada
A caverna será modelada como uma matriz de duas dimensoes, cujos elementos representam os saloes.
Um salao que nao tem parede de cristal e que tem saída para o exterior da caverna é representado pelo
valor 0; um salao que nao tem parede de cristal e nao tem saída para o exterior é representado pelo
valor 1; um salao que tem parede de cristal é representado pelo valor 2; e o salao em que o duende está
inicialmente (que nao tem saída para o exterior e nem paredes de cristal) é representado pelo valor 3.
A figura abaixo mostra a representaçao da caverna apresentada acima.

1
A primeira linha da entrada contém dois números inteiros N e M que indicam respectivamente o
número de linhas (1 <= N <= 10) e o número de colunas (1 <= M <= 10) da representaçao da caverna.
Cada uma das N linhas seguintes contém M números inteiros Ci, descrevendo os saloes da caverna e a
posiçao inicial do duende (0 <= Ci <= 3). Voce pode supor que sempre há um trajeto que leva Gugo a
saída da caverna.

Saída
Seu programa deve produzir uma unica linha na saída, contendo um número inteiro representando a
quantidade mínima de saloes pelos quais Gugo deve passar antes de conseguir sair da caverna (nao
contando o salao em que ele está inicialmente, mas contando o salao que tem saída para o exterior).

Exemplo 1
Entrada: Exemplo 2
4 5
Entrada:
0 1 1 1 1
1 10
0 2 2 2 1
2 0 1 1 3 1 1 1 0 1
2 1 1 1 1
1 1 1 3 1
Saída:
3
Saída:
8

Restriçoes

1 <= N <= 10
1 <= M <= 10
0 <= Ci <= 3

Added by: Wanderley Guimarăes


Date: 2008-04-02
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: Olimpíada Brasileira de Informática 2005 -- Programaçăo Nível 1

2
SPOJ Problem Set (obi)

2609. Trilhas
Problem code: TRILHAS
Nos finais de semana Paulo faz longas caminhadas pelas bonitas trilhas que atravessam as matas
vizinhas a sua cidade. Recentemente Paulo adquiriu um aparelho de GPS (siglas do ingles Sistema de
Posicionamento Global) e com ele mapeou as mais belas trilhas da regiao. Paulo programou o GPS
para armazenar, a intervalos regulares, a altitude do ponto corrente durante o trajeto. Assim, após
percorrer as trilhas com o seu GPS, Paulo tem informaçoes que permitem por exemplo produzir
gráficos como os abaixo:

[IMAGE]

Paulo tem uma nova namorada, e quer convence-la a passear junto com ele pelas trilhas. Para o
primeiro passeio juntos, Paulo quer escolher uma trilha "fácil". Segundo o seu critério, a trilha mais
fácil é a que, em um dos sentidos do percurso, exige o menor esforço de subida. O esforço exigido em
um trecho de subida é proporcional ao desnível do trecho.

Tarefa
Dadas as informaçoes colhidas por Paulo sobre distâncias e altitudes de um conjunto de trilhas, voce
deve escrever um programa que determine qual é a trilha que exige o menor esforço de subida.

Entrada
A primeira linha da entrada contém um número inteiro N que indica o número de trilhas. Cada uma
das N linhas seguintes contém a descriçao de uma trilha (1 <= N <= 100). As trilhas sao identificadas
por números de 1 a N. A ordem em que as trilhas aparecem na entrada determina os seus
identificadores (a primeira trilha é a de número 1, a segunda a de número 2, a última a de número N).
A descriçao de uma trilha inicia com um número inteiro M que indica a quantidade de pontos de
mediçao da trilha (2 <= M <= 1000), seguido de M números inteiros Hi representando a altura dos
pontos da trilha (medidos a intervalos regulares e iguais para todas as linhas). Paulo pode percorrer a
trilha em qualquer sentido (ou seja, partindo do ponto de altitude H1 em direçao ao ponto de altitude
HM, ou partindo do ponto de altitude HM em direçao ao ponto de altitude H1).

Saída
Seu programa deve produzir uma unica linha na saída, contendo um número inteiro representando o
identificador da melhor trilha, conforme determinado pelo seu programa. Em caso de empate entre
duas ou mais trilhas, imprima a de menor identificador.

1
Exemplo 1
Exemplo 2
Entrada:
5 Entrada:
4 498 500 498 498 3
10 60 60 70 70 70 70 80 90 90 100 5 600 601 600 601 600
5 200 190 180 170 160 4 500 499 500 499
2 1000 900 4 300 300 302 300
4 20 20 20 20
Saída:
Saída: 2
2

Restriçoes

1 <= N <= 100


2 <= M <= 1000
0 <= Hi <= 1000

Added by: Wanderley Guimaraes


Date: 2008-04-02
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Olimpíada Brasileira de Informática 2005 -- Programaçao Nível 1

2
SPOJ Problem Set (obi)

3773. Eleiçoes
Problem code: ELEICOES
O prefeito de Piraporinha do Sul foi afastado de seu cargo, devido a acusaçoes de corrupçao em
contratos da prefeitura, e por isso foram convocadas novas eleiçoes para prefeito. Procurando uma
renovaçao política, a comissao eleitoral permitiu que mesmo candidatos de fora da cidade
concorressem ao cargo de prefeito.

Devido a essa nova regra, houve uma quantidade muito grande de candidatos a prefeitura. O software
da comissao eleitoral de Piraporinha do Sul nao estava preparado para isso, e por isso voce foi
contratado para escrever um programa que, dados os votos lançados pelos habitantes da cidade, decide
qual candidato ganhou.

Entrada
A entrada é composta de um único caso de teste. A primeira linha contém um inteiro N representando
o número de votos. Nas próximas N linhas, haverá um inteiro X i , que representa o i-ésimo voto (os
candidatos sao identificados por inteiros).

Saída
Para cada conjunto de teste da entrada seu programa deve produzir uma única linha, contendo o
número do candidato que venceu (aquele que obteve mais votos). Voce pode supor que existe apenas
um vencedor.

Restriçoes
1 <= N <= 100000
1 < X i <= 1000000000

Exemplo
Entrada

5
1000
1000
2588
4000
2587

Saída

1000

Entrada

1
4000
3500
4000
4000

Saída

4000

Added by: Wanderley Guimaraes


Date: 2009-01-26
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Treino para OBI de 2006 - Fábio Moreira & Daniel Fleischman

2
SPOJ Problem Set (obi)

3774. Fatorial
Problem code: FATORIA2
Dado um inteiro N, determine quanto vale N fatorial (escreve-se N!). O fatorial de um número é o
produto de todos os números entre 1 e N, inclusive. Por exemplo, 5! = 5 × 4 × 3 × 2 × 1 =
120.

Entrada
A entrada é composta por uma única linha que contém o inteiro N.

Saída
A saída deve consistir de apenas uma linha contendo o valor de N!.

Restriçoes
0 <= N <= 12

Exemplo
Entrada

Saída

Entrada

Saída

Added by: Wanderley Guimaraes


Date: 2009-01-26
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Treino para OBI de 2006 - Fábio Moreira & Daniel Fleischman

1
SPOJ Problem Set (obi)

3775. Fliperama
Problem code: FLIPERAM
Bebe-bebe é um jogo muito popular de fliperama. E, como a maioria dos jogos de fliperama, ele deve
mostrar as maiores pontuaçoes. Para esse fim, a companhia Otori te contratou.

Escreva um programa que, dada a lista de todas as pontuaçoes dos jogos de Bebe-bebe, mostra os
melhores placares em ordem decrescente.

Entrada
A entrada é composta de um único caso de teste. A primeira linha consiste de dois inteiros N e M,
dizendo quantas partidas foram jogadas de Bebe-bebe e quantas linhas cabem no mostrador de
melhores rankings. As N linhas seguintes contem cada uma um inteiro indicando a pontuaçao obtida
em cada jogo.

Saída
Seu programa deve imprimir M linhas, contendo as M maiores pontuaçoes em ordem decrescente.

Restriçoes
1 <= N <= 10000
1 <= M <= 500
M <= N

Exemplo
Entrada
7 4
100
200
200
150
30
524
942

Saída
942
524
200
200

Entrada
2 1
4000

1
2000

Saída
4000

Added by: Wanderley Guimaraes


Date: 2009-01-26
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Treino para OBI de 2006 - Fábio Moreira & Daniel Fleischman

2
SPOJ Problem Set (obi)

3776. Árvore Genealógica


Problem code: GENEAL
A empresa Genesis faz vários serviços dedicados a famílias, principalmente para descobrir parentes e
parentescos perdidos. Para mostrar a eficiencia de seus serviços, a Genesis quer, para cada árvore
genealógica que ela tem, achar o par de parentes com parentesco mais distante. Para isso, eles
definiram uma "funçao-parentesco" definida da seguinte forma:

1. grau(A, B) = 0, se A = B
2. grau(A, B) = 1 + min{grau(pai(A), B), grau(A, pai(B))}, se A != B

Voce deve fazer um programa que, dado uma árvore genealógica, imprime o nome dos dois parentes
com maior grau de parentesco.

Entrada
A entrada é composta de um único caso de teste. A primeira linha contém um número inteiro positivo
N, que indica o número de relaçoes pai-filho que serao descritas. As N linhas seguintes contem duas
strings cada, P e F, indicando que P é pai de F.

Saída
Seu programa deve imprimir uma única linha contendo os nomes do par de parentes com maior grau
de parentesco, e esse grau. Essas duas strings devem estar em ordem alfabética; em caso de empate,
voce pode imprimir qualquer par com essa característica.

Restriçoes
2 <= N <= 1000
Todos os nomes tem tamanho máximo 50.

Exemplo
Entrada
11
arnaldo daniel
alfredo rafael
alfredo deborah
angela marcelo
julio arnaldo
angela elaine
angela guilherme
arnaldo renato
marcelo beatriz
julio angela
julio alfredo

Saída

1
beatriz daniel 5

Entrada
5
a b
b c
a d
d e
e f

Saída
c f 5

Added by: Wanderley Guimaraes


Date: 2009-01-27
Time limit: 1s
Source limit:50000B
Languages: All except: TCL SCALA ERL TECS JS
Resource: Treino para OBI de 2006 - Fábio Moreira & Daniel Fleischman

2
SPOJ Problem Set (obi)

3826. Miojo
Problem code: MIOJO
Joao é um fanático por miojos; ele os adora, e, como era de se esperar, ele levou vários pacotes quando
foi acampar com seus colegas. Como Joao só gosta de miojos feitos com o tempo exato, ele se
deseperou ao perceber que havia esquecido seu relógio em casa.

Por sorte, ele conseguiu, no caminho, comprar duas ampulhetas de duraçoes diferentes. Por exemplo,
se o miojo precisa de 3 minutos para ficar pronto, e Joao tiver uma ampulheta de 5 minutos e outra de
7, uma possível forma de cozinhar o miojo é:

1. Joao começa virando as duas ampulhetas ao mesmo tempo.


2. Quando a areia da ampulheta de 5 minutos se esgotar, Joao torna a virá-la.
3. Joao começa a preparar o miojo quando a areia da ampulheta de 7 minutos acabar.
4. Joao tira o miojo do fogo quando a ampulheta de 5 minutos acabar novamente.

Dessa forma, o miojo ficará 3 minutos no fogo (do minuto 7 ao minuto 10). Assim, apesar do miojo
levar apenas tres minutos para ser cozido, ele precisa de 10 minutos para ficar pronto.

Faça um programa que, dado o tempo de preparo do miojo, e os tempos das duas ampulhetas (ambos
maiores que o tempo do miojo), determina o tempo mínimo necessário para o miojo ficar pronto. Voce
pode supor que sempre é possível cozinhar o miojo no tempo correto.

Entrada
A entrada contém um único caso de teste, composto por uma única linha, que contém tres inteiros T, A
e B, representando o tempo necessário para o preparo do miojo, o tempo da primeira ampulheta e o
tempo da segunda ampulheta respectivamente.

Saída
Seu programa deve produzir uma única linha na saída, contendo o tempo mínimo para o preparo do
miojo.

Restriçoes
0 <= T <= 10000
T < A, B <= 40000

Exemplo
Entrada
3 5 7

Saída
10

1
Entrada
14 15 22

Saída
44

Added by: Wanderley Guimaraes


Date: 2009-02-07
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Treino para OBI de 2006 - Fábio Moreira & Daniel Fleischman

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

3828. Primo
Problem code: PRIMO

Tarefa
Dado um inteiro N, verifique se N é primo.

Entrada
A entrada é composta por um único caso de teste, composto por uma única linha que contém o inteiro
N.

Saída
Seu programa deve produzir uma única linha, contendo a palavra "sim", se N for primo, e "nao", caso
contrário (note a ausencia de acentuaçao).

Restriçoes
|N| < 2 31

Exemplo
Entrada
7

Saída
sim

Entrada
10

Saída
nao

Added by: Wanderley Guimarăes


Date: 2009-02-07
Time limit: 1s
Source limit:50000B
Cluster: Pyramid (Intel Pentium III 733 MHz)
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: Treino para OBI de 2006 - Fábio Moreira & Daniel Fleischman

1
SPOJ Problem Set (obi)

3829. Quadrados
Problem code: QUADRAD2
Dado um inteiro N, determine quanto vale N 2 .

Entrada
A entrada é composta por um único caso de teste, composto por uma única linha que contém o inteiro
N.

Saída
Seu programa deve produzir uma única linha, contendo o valor de N 2 .

Restriçoes
|N| <= 10000

Exemplo
Entrada
1

Saída
1

Entrada
4

Saída
16

Entrada
2

Saída
4

Added by: Wanderley Guimaraes


Date: 2009-02-07
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Treino para OBI de 2006 - Fábio Moreira & Daniel Fleischman

1
SPOJ Problem Set (obi)

3830. Soma
Problem code: SOMA
Dada uma lista de N inteiros, encontre a soma de todos eles.

Entrada
A entrada é composta de um único caso de teste. A primeira linha contém um inteiro positivo N. As N
linhas seguintes contem cada uma um inteiro X, representando os N números a serem somados.

Saída
Seu programa deve produzir uma única linha na saída, contendo a soma de todos os N inteiros.

Restriçoes
0 <= N <= 50
|X| <= 5000

Exemplo
Entrada
2
2
3

Saída
5

Entrada
3
1
5
3

Saída
9

Added by: Wanderley Guimaraes


Date: 2009-02-07
Time limit: 1s
Source limit:50000B
Languages: All
Resource: Treino para OBI de 2006 - Fábio Moreira & Daniel Fleischman

1
SPOJ Problem Set (obi)

8703. Conta de água


Problem code: CONTA1
 

A empresa local de abastecimento de água, a Saneamento Básico da Cidade (SBC), está promovendo
uma campanha de conservaçao de água, distribuindo cartilhas e promovendo açoes demonstrando a
importância da água para a vida e para o meio ambiente.

Para incentivar mais ainda a economia de água, a SBC alterou os preços de seu fornecimento de forma
que, proporcionalmente, aqueles clientes que consumirem menos água paguem menos pelo metro
cúbico. Todo cliente paga mensalmente uma assinatura de R$ 7, que inclui uma franquia de 10 m^3 de
água. Isto é, para qualquer consumo entre 0 e 10 m^3 , o consumidor paga a mesma quantia de R$ 7
reais (note que o valor da assinatura deve ser pago mesmo que o consumidor nao tenha consumido
água). Acima de 10 m^3 cada metro cúbico subsequente tem um valor diferente, dependendo da faixa
de consumo. A SBC cobra apenas por quantidades inteiras de metros cúbicos consumidos. A tabela
abaixo especifica o preço por metro cúbico para cada faixa de consumo:

Faixa de consumo (m^3) Preço (m^3)


até 10 incluído na franquia
11 a 30 R$ 1
31 a 100 R$ 2
101 em diante R$ 5

Assim, por exemplo, se o consumo foi de 120 m^3 , o valor da conta é:

7 reais da assinatura básica;


20 reais pelo consumo no intervalo 11 - 30 m^3;
140 reais pelo consumo no intervalo 31 - 100 m^3;
100 reais pelo consumo no intervalo 101 - 120 m^3.

Logo o valor total da conta de água é R$ 267.

Tarefa
Escreva um programa que, dado o consumo de uma residencia em m3 , calcula o valor da conta de
água daquela residencia.

Entrada
A única linha da entrada contém um único inteiro N, indicando o consumo de água da residencia, em
m^3 (0 <= N <= 10^3).

1
Saída
Seu programa deve imprimir uma única linha, contendo o valor da conta de água daquela residencia.

Exemplo
Entrada
8

Saída
7

Entrada
14

Saída
11

Entrada
42

Saída
51

Added by: Wanderley Guimarăes


Date: 2011-04-10
Time limit: 1s
Source limit:50000B
Languages: All except: CLOJ ERL F# GO JS PERL 6 PYTH 3.1.2 SCALA TCL
Resource: OBI 2010 - fase 1 nível 1

2
SPOJ Problem Set (obi)

8704. Copa do mundo


Problem code: COPA1
 

Este ano tem Copa do Mundo! O país inteiro se prepara para torcer para a equipe canarinho conquistar
mais um título, tornando-se hexacampea.

Na Copa do Mundo, depois de uma fase de grupos, dezesseis equipes disputam a Fase final, composta
de quinze jogos eliminatórios. A figura abaixo mostra a tabela de jogos da Fase final:

Na tabela de jogos, as dezesseis equipes finalistas sao representadas por letras maiúsculas (de A a P), e
os jogos sao numerados de 1 a 15. Por exemplo, o jogo 3 é entre as equipes identificadas por E e F; o
vencedor desse jogo enfrentará o vencedor do jogo 4, e o perdedor será eliminado. A equipe que
vencer os quatro jogos da Fase final será a campea (por exemplo, para a equipe K ser campea ela deve
vencer os jogos 6, 11, 14 e 15.

Tarefa
Dados os resultados dos quinze jogos da Fase final, escreva um programa que determine a equipe
campea.

Entrada
A entrada é composta de quinze linhas, cada uma contendo o resultado de um jogo. A primeira linha
contém o resultado do jogo de número 1, a segunda linha o resultado do jogo de número 2, e assim por
diante. O resultado de um jogo é representado por dois números inteiros M e N separados por um
espaço em branco, indicando respectivamente o número de gols da equipe representada a esquerda e a
direita na tabela de jogos (0 <= M <= 20, 0 <= N <= 20 e M != N).

1
Saída
Seu programa deve imprimir uma única linha, contendo a letra identificadora da equipe campea.

Exemplo
Entrada
4 1
1 0
0 4
3 1
2 3
1 2
2 0
0 2
1 2
4 3
0 1
3 2
3 4
1 4
1 0

Saída
F

Entrada
2 0
1 0
2 1
1 0
1 0
1 2
1 2
1 0
2 1
1 0
0 1
0 2
2 1
1 0
2 1

Saída
A

Added by: Wanderley Guimarăes


Date: 2011-04-10
Time limit: 1s
Source limit:50000B
Languages: All except: CLOJ ERL F# GO JS PERL 6 PYTH 3.1.2 SCALA TCL
Resource: OBI 2010 - fase 1 nível 1

2
SPOJ Problem Set (obi)

8776. Batalha naval


Problem code: BATALHA2
 

Pedro e Paulo gostam muito de jogar batalha naval; apesar de serem grandes amigos, Pedro desconfia
que Paulo nao esteja jogando honestamente. Para tirar essa dúvida, Pedro decidiu usar um programa de
computador para verificar o resultado do jogo, mas Pedro nao sabe programar e por isso pediu a sua
ajuda.

O jogo de batalha naval é jogado em um tabuleiro retangular com N linhas e M colunas. Cada posiçao
deste tabuleiro é um quadrado que pode conter água ou uma parte de um navio. Dizemos que dois
quadrados sao vizinhos se estes possuem um lado em comum. Se duas partes de navio estao em
posiçoes vizinhas, entao essas duas partes pertencem ao mesmo navio. A regra do jogo proíbe que os
quadrados de duas partes de navios distintos tenham um canto em comum (em outras palavras, que
quadrados de duas partes de navios distintos compartilhem um vértice).

Cada disparo que um jogador faz deve ser feito em um dos quadrados do tabuleiro do outro jogador.
Um jogador informa ao outro a coluna e a linha do quadrado alvo do disparo. Para que um navio seja
destruído, o jogador deve acertar todas as partes deste navio. O jogador nao pode atirar no mesmo
lugar mais de uma vez

Tarefa
Escreva um programa que, dadas a configuraçao do tabuleiro e uma sequencia de disparos feitos por
um jogador, determina o número de navios do outro jogador que foram destruídos.

Entrada
A primeira linha da entrada contém números dois inteiros N e M (1 <= N <= 100 e M <= 100)
representando respectivamente o número de linhas e de colunas do tabuleiro. As N seguintes linhas
correspondem ao tabuleiro do jogo. Cada uma dessas linhas contém M caracteres. Cada caractere
indica o conteúdo da posiçao correspondente no tabuleiro. Se esse caractere for ’.’, essa posiçao
contém água; se for ’#’, essa posiçao contém uma parte de um navio. A próxima linha contém um
número K que é o número de disparos feitos pelo jogador (1 <= K <= N × M). As próximas K linhas
indicam os disparos feitos pelo jogador. Cada linha contém dois inteiros L e C, indicando a linha e a
coluna do disparo feito pelo outro jogador (1 <= L <= N e 1 <= C <= M).

Saída
Seu programa deve imprimir uma única linha contendo um único número inteiro, o número de navios
destruído.

1
Exemplo
Entrada
5 5
..#.#
#....
...#.
#....
...#.
5
1 3
1 4
1 5
2 1
3 4

Saída
4

Entrada
5 5
..###
.....
#####
.....
#.##.
5
5 1
5 2
1 3
1 4
1 5

Saída
2

Entrada
7 7
.#....#
###..##
.#....#
....#.#
.#..#.#
.####.#
.......
8
1 1
1 2
2 1
2 2
2 3
3 2
5 2
6 2

Saída
1

2
Added by: Wanderley Guimarăes
Date: 2011-04-28
Time limit: 1s
Source limit:50000B
Languages: All except: CLOJ ERL F# GO JS PERL 6 PYTH 3.1.2 SCALA TCL
Resource: OBI 2010 - fase 1 nível 2

3
SPOJ Problem Set (obi)

8777. Cometa
Problem code: COMETA2
O cometa Halley é um dos cometas de menor período do Sistema Solar, completando uma volta em
torno do Sol a cada 76 anos; na última ocasiao em que ele tornou-se visível do planeta Terra, em 1986,
várias agencias espaciais enviaram sondas para coletar amostras de sua cauda e assim confirmar
teorias sobre suas composiçoes químicas.

Tarefa
Escreva um programa que, dado o ano atual, determina qual o próximo ano em que o cometa Halley
será visível novamente do planeta Terra. Se o ano atual é um ano de passagem do cometa, considere
que o cometa já passou nesse ano (ou seja, considere sempre o próximo ano de passagem, nao
considerando o ano atual).

Entrada
A única linha da entrada contém um único inteiro A (2010 ≤ A ≤ 10 4 ), indicando o ano atual.

Saída
Seu programa deve imprimir uma única linha, contendo um número inteiro, indicando o próximo ano
em que o cometa Halley será visível novamente do planeta Terra.

Exemplo
Entrada
2010

Saída
2062

Entrada
10000

Saída
10042

Entrada
2062

Saída
2138

1
Added by: Wanderley Guimarăes
Date: 2011-04-28
Time limit: 1s
Source limit:50000B
Languages: All except: CLOJ ERL F# GO JS PERL 6 PYTH 3.1.2 SCALA TCL
Resource: OBI 2010 - fase 1 nível 2

2
SPOJ Problem Set (obi)

8778. Elevador
Problem code: ELEVADO2
A Subindo Bem Confortavelmente (SBC) é uma empresa tradicional, com mais de 50 anos de
experiencia na fabricaçao de elevadores. Todos os projetos da SBC seguem as mais estritas normas de
segurança, mas infelizmente uma série de acidentes com seus elevadores manchou a reputaçao da
empresa.

Ao estudar os acidentes, os engenheiros da companhia concluíram que, em vários casos, o acidente foi
causado pelo excesso de passageiros no elevador. Por isso, a SBC decidiu fiscalizar com mais rigor o
uso de seus elevadores: foi instalado um sensor em cada porta que detecta a quantidade de pessoas que
saem e entram em cada andar do elevador.

A SBC tem os registros do sensor de todo um dia de funcionamento do elevador (que sempre começa
vazio). Eles sabem que as pessoas sao educadas e sempre deixam todos os passageiros que irao sair em
um andar saírem antes de outros passageiros entrarem no elevador, mas ainda assim eles tem tido
dificuldade em decidir se a capacidade máxima do elevador foi excedida ou nao.

Tarefa
Escreva um programa que, dada uma sequencia de leituras do sensor e a capacidade máxima do
elevador, determina se a capacidade máxima do elevador foi excedida em algum momento.

Entrada
A primeira linha da entrada contém dois inteiros N e C, indicando o número de leituras realizadas pelo
sensor e a capacidade máxima do elevador, respectivamente (1 ≤ N ≤ 1000 e 1 ≤ C ≤ 1000). As N
linhas seguintes contem, cada uma, uma leitura do sensor. Cada uma dessas linhas contém dois inteiros
S e E, indicando quantas pessoas saíram e quantas pessoas entraram naquele andar, respectivamente (0
≤ S ≤ 1000 e 0 ≤ E ≤ 1000)

Saída
Seu programa deve imprimir uma única linha contendo o caractere ’S’, caso a capacidade do elevador
tenha sido excedida em algum momento, ou o caractere ’N’ caso contrário.

Exemplo
Entrada
5 10
0 5
2 7
3 3
5 2
7 0

1
Saída
N

Entrada
5 10
0 3
0 5
0 2
3 4
6 4

Saída
S

Entrada
6 4
0 5
3 5
4 5
1 0
1 1
1 1

Saída
S

Added by: Wanderley Guimarăes


Date: 2011-04-28
Time limit: 1s
Source limit:50000B
Languages: All except: CLOJ ERL F# GO JS PERL 6 PYTH 3.1.2 SCALA TCL
Resource: OBI 2010 - fase 1 nível 2

2
SPOJ Problem Set (obi)

8779. Reuniao
Problem code: REUNIAO2
Todos os anos, a SBC (Sociedade Brasileira de Caminhoneiros) reúne seus membros em alguma
cidade para discutir sobre a profissao. Nessas reunioes sao discutidos os problemas da categoria e sao
apresentadas sugestoes sobre como melhorar as condiçoes de trabalho.

O grande problema desse tipo de encontro é que os membros estao espalhados pelo país, uma vez que
a profissao exige que eles viajem para diversos lugares todos os dias. Por isso, a escolha da cidade
onde será feita a reuniao sempre é feita de modo que nao prejudique demais nenhum dos
caminhoneiros. O critério para tal é que a maior das distâncias percorridas pelos caminhoneiros para
chegar ao local da reuniao deve ser a menor possível. Ou seja, a distância percorrida pelo
caminhoneiro que vai percorrer a maior distância entre todos os caminhoneiros para chegar a reuniao
deve ser a menor possível.

Tarefa
Dadas as cidades onde se encontram os caminhoneiros e a descriçao das estradas que interligam essas
cidades, escreva um programa que determina qual será a menor distância máxima percorrida por um
caminhoneiro para chegar até o local da reuniao. Os caminhoneiros conhecem bem as estradas, e
portando sempre fazem o menor caminho possível até a cidade da reuniao. Sempre existe um caminho
ligando quaisquer duas cidades.

Entrada
A primeira linha da entrada possui dois números inteiros N (2 ≤ N ≤ 100) e M (N - 1 ≤ M ≤ 10000),
que representam, respectivamente, o número de cidades e o número de estradas que as interligam. As
cidades sao identificadas por números inteiros entre 0 e N - 1. As próximas M linhas da entrada
possuem, cada uma, a descriçao de uma estrada. Cada descriçao de entrada é composta por tres
números inteiros: U, V e W, onde U e V representam cidades (0 ≤ U ≤ N - 1 e 0 ≤ V ≤ N - 1) e W
representa o comprimento da estrada que une essas duas cidades (todas as estradas sao mao dupla, 1 ≤
W ≤ 100). É sempre possível viajar entre qualquer duas cidades com as estradas existentes, mas pode
haver mais de uma estrada ligando o mesmo par de cidades .

Saída
Seu programa deve imprimir uma única linha contendo um número inteiro, a distância máxima
percorrida por um caminhoneiro para ir até a reuniao, obedecidas as restriçoes estabelecidas (ou seja,
essa distância máxima deve ser a menor possível).

1
Exemplo
Entrada
4 4
0 1 2
0 2 4
1 3 1
2 3 5

Saída
4

Entrada
4 5
0 1 2
0 2 4
1 3 1
2 3 5
3 2 2

Saída
3

Entrada
7 12
0 1 22
0 2 30
0 5 35
1 5 11
1 6 30
1 2 25
2 3 15
2 6 10
3 4 15
3 5 10
4 5 20
5 6 33

Saída
30

Added by: Wanderley Guimarăes


Date: 2011-04-28
Time limit: 1s
Source limit:50000B
Languages: All except: CLOJ ERL F# GO JS PERL 6 PYTH 3.1.2 SCALA TCL
Resource: OBI 2010 - fase 1 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

8780. Altas aventuras


Problem code: ALTAS2
 

Incentivado por um filme de animaçao recente, vovô resolveu realizar seu sonho de criança fazendo
sua pequena casa voar amarrada a baloes de hélio. Comprou alguns baloes coloridos de boa qualidade,
para fazer alguns testes, e começou a planejar a grande aventura. A primeira tarefa é determinar qual a
quantidade de hélio máxima que pode ser injetada em cada balao de maneira que ele nao estoure.

Suponha que os valores possíveis de quantidade de hélio em cada balao variem entre os valores 1 e N .
Claro que vovô poderia testar todas as possibilidades, mas esse tipo de soluçao ineficiente nao é
apropriada, ainda mais considerando que vovô comprou apenas K baloes para os testes.

Por exemplo, suponha que N = 5 e K = 2. Nesse caso, a melhor soluçao seria testar primeiro em 3.
Caso o balao estoure, vovô só teria mais um balao, entao teria de testar 1 e 2 no pior caso, somando ao
todo 3 testes. Caso o balao nao estoure, vovô poderia testar 4 e depois 5 (ou 5 e depois 4), também
somando 3 ao todo.

Tarefa
Dados a capacidade máxima da bomba e o número de baloes, indicar o número mínimo de testes que
devem ser feitos, no pior caso, para determinar o ponto em que um balao estoura.

Entrada
A única linha da entrada contém dois inteiros, N e K, separados por espaço em branco (1 <= K <= N
<= 1.000.000.000).

Saída
Seu programa deve imprimir uma única linha, contendo um inteiro que representa o número mínimo
de testes que devem ser feitos no pior caso para determinar o ponto em que o balao estoura.

Exemplo
Entrada
5 2

Saída
3

Entrada

1
20 2

Saída
6

Entrada
11 5

Saída
4

Added by: Wanderley Guimarăes


Date: 2011-04-28
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2010 - fase 2 nível 2

2
SPOJ Problem Set (obi)

8781. Floresta
Problem code: FLOREST2
 

O desmatamento é um dos maiores problemas enfrentados pelo Brasil hoje; estima-se que mais de 10
mil km^2 de vegetaçao sejam desflorestados todo ano. Além de destruir os habitats de várias espécies
em risco de extinçao, o desmatamento promove a emissao de gás carbônico, principal responsável pelo
efeito estufa e pelo aquecimento global.

A Fundaçao de Conservaçao dos Carvalhos (FCC) tenta combater esta tendencia, promovendo o
reflorestamento das regioes desmatadas. Para isso, eles pretendem plantar carvalhos formando um
quadriculado (um carvalho em cada vértice); no centro de cada quadrado formado por eles, a FCC
também plantará um eucalipto. Para preservar a biodiversidade da área plantada, pelo menos uma
árvore de cada espécie deve ser plantada durante o reflorestamento.

Por exemplo, se a FCC quiser plantar 23 árvores, ela poderá faze-lo de duas maneiras: ou formando
um retângulo 3 × 5 com os carvalhos, como na figura (a), ou formando um retângulo 2 × 8, como na
figura (b).

Considere que, para os propósitos deste problema, um retôngulo x × y é equivalente a um retângulo y


× x.

Tarefa
Escreva um programa que, dado o número total de árvores que devem ser plantadas, de quantas
maneiras diferentes elas podem ser dispostas.

1
Entrada
A única linha da entrada contém um único inteiro N, que indica o número total de árvores que devem
ser plantadas (1 <= N <= 10 9 ) .

Saída
Seu programa deve imprimir uma única linha, contendo um único inteiro, indicando o número de
arranjos distintos que podem ser feitos para o reflorestamento.

Exemplo
Entrada
23

Saída
2

Entrada
7

Saída
0

Entrada
53

Saída
3

Added by: Wanderley Guimarăes


Date: 2011-04-28
Time limit: 1s
Source limit:50000B
Languages: All except: CLOJ ERL F# GO JS PERL 6 PYTH 3.1.2 SCALA TCL
Resource: OBI 2010 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

8782. Matrizes
Problem code: MATRIZ2
 

O conglomerado indiano Tutu é um conjunto de empresas que atua nos mais diversos ramos da
indústria, produzindo desde sapatos até avioes e foguetes. Por ser tao diversificada, precisa de grandes
e rápidos sistemas para cálculos de contabilidade.

Um dos módulos mais importantes desse sistema é o de fornecimento de produtos, onde fica a base de
dados de produtos e fornecedores. Um mesmo produto pode ser fornecido por vários fornecedores
diferentes.

A outra grande matriz é a B, onde cada linha representa um dia do mes e cada coluna é um produto. O
valor da matriz na linha m e coluna n representa a quantidade do produto n a ser adquirido no dia m.

Tal empresa tem uma política de fidelidade com seus fornecedores, e uma das práticas efetuadas pela
empresa é, em um determinado dia, comprar todos os produtos necessários de um único fornecedor.
Isto é, em um dia todos os produtos adquiridos serao comprados do fornecedor x, no outro dia do
fornecedor y, e assim por diante

Para auxiliar a escolha de qual fornecedor será o escolhido no dia, foi gerada outra matriz C, que é o
resultado da multiplicaçao das matrizes A × B. Essa matriz diz o quanto será gasto pela empresa se
adquirir todos os produtos de um determinado fornecedor em um determinado dia.

As matrizes A e B sao quadradas (o número de linhas é igual ao número de colunas) e tem valores
definidos pelas fórmulas

A ij = ( P × i + Q × j) (mod X)

B ij = ( R × i + S × j) (mod Y)

onde i é o índice da linha da matriz e j é o índice da coluna da matriz (todos os índices vao de 1 até N).
Os inteiros P, Q, R, S, X e Y sao parâmetros constantes, que definem as duas matrizes A e B.

Tarefa
Escreva um programa que, dados os parâmetros das matrizes A e B, e a posiçao de uma das entradas
as matriz C, calcula o valor daquela entrada.

1
Entrada
A primeira linha da entrada contém um inteiro N, indicando as dimensoes das matrizes A, B e C (2 <=
N <= 10 5 ). A linha seguinte contém seis inteiros P , Q, R, S, X e Y , indicando os parâmetros das
matrizes A e B (2 <= X, Y <= 10 4 ; 0 <= P, Q < X; 0 <= R, S < Y ). Finalmente, a última linha da
entrada contém dois inteiros I e J, indicando a linha e a coluna da matriz C a serem consultados (1 <=
I, J <= N>).

Saída
Seu programa deve imprimir uma única linha contendo o valor da matriz C na linha e coluna
especiďŹcadas.

Exemplo
Entrada
3
4 3 2 3 5 6
2 2

Saída
18

Entrada
4
3 5 1 0 6 7
4 3

Saída
30

Entrada

2
2 2 0 1 3 2
2 1

Saída
2

Added by: Wanderley Guimarăes


Date: 2011-04-28
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2010 - fase 2 nĂ-vel 2

2
SPOJ Problem Set (obi)

8783. Telescópio
Problem code: TELESCO2
Telescópios sao instrumentos que auxiliam a observaçao do céu, melhorando e aumentando o aspecto
das estrelas, planetas e outros objetos brilhantes. Existem diversos tipos de telescópios, sendo os tipos
mais comuns os de lentes objetivas (refratores) e os de espelhos (refletores).

A maneira como os telescópios melhoram a nossa percepçao dos astros no céu é aumentando a
quantidade de luz captada que chega aos nossos olhos. Toda luz que entra pelos nossos olhos entra por
um orifício chamado pupila. Tal controla a quantidade de luz que entra nos olhos, aumentando o
diâmetro quando o ambiente está escuro (e portanto precisamos obter mais luz para identificar os
objetos) e diminuindo quando o ambiente está claro. Num ambiente muito escuro, a pupila pode
atingir um diâmetro de 8 mm.

Cada objeto celeste (estrela, planeta, nebulosa, etc) emite uma quantidade de luz (fótons) que é
homogeneamente distribuída quando chega na Terra. Por exemplo, a estrela A emite luz que pode ser
captada a um fluxo de 40.000 fótons por segundo por milímetro quadrado. Isso é, a cada segundo, é
possível captar 40.000 fótons provenientes da estrela A numa área de 1 mm⊃. Ou seja, uma pupila de
10 mm˛ de área captaria 400.000 fótons provenientes da estrela A por segundo.

Para que nosso cérebro consiga interpretar que existe um objeto ali, porém, ele precisa receber
40.000.000 fótons por segundo. Assim, podemos utilizar um telescópio com lente (ou espelho) de 100
mm˛ de área, que vai captar a quantidade necessária de fótons provenientes da estrela A e
encaminhá-los até nossa pupila, fazendo assim com que nosso cérebro perceba a presença da estrela
ali.

Tarefa
Dada uma lista com estrelas no céu, o fluxo de fótons que cada uma delas emite, e área de abertura de
um telescópio, dizer quantas estrelas serao perceptíveis usando tal telescópio.

Entrada
A primeira linha da entrada terá um inteiro A (1 ≤ A ≤ 10.000) representando a área de abertura do
telescópio (em milímetros quadrados) a ser considerado. A segunda linha possui um inteiro N (1 ≤ N ≤
10.000) representando o número de estrelas a serem estudadas. As N linhas seguintes terao, cada uma,
um inteiro F (1 ≤ F ≤ 20.000) representando o fluxo de fótons que cada uma das N estrelas emitem
(em fótons por segundo por milímetro quadrado).

Saída
Imprima um inteiro representando a quantidade de estrelas que serao percebidas ao se utilizar o
telescópio em questao.

1
Exemplo
Entrada
10000
3
4000
3500
5100

Saída
2

Entrada
5869
3
3975
14234
8569

Saída
2

Entrada
2967
9
18650
16338
2400
17702
14619
13934
7979
16316
1053

Saída
6

Added by: Wanderley Guimarăes


Date: 2011-04-28
Time limit: 1s
Source limit:50000B
Languages: All except: CLOJ ERL F# GO JS PERL 6 PYTH 3.1.2 SCALA TCL
Resource: OBI 2010 - fase 2 nível 2

2
SPOJ Problem Set (obi)

8784. Tradutor alienígena


Problem code: TRADUTO2
 

É de conhecimento público e notório que já fomos visitados por alienígenas diversas vezes. A grande
dificuldade que temos, porém, é a comunicaçao com eles, por causa de grandes diferenças entre as
línguas. Além disso, assim como nós, eles também tem várias línguas diferentes.

Com o intuito de auxiliar no processo de traduçao, foi criado um método de mapeamento dos símbolos
do alfabeto de cada língua alienígena, atribuindo um número inteiro para cada símbolo. Sendo assim,
para um alfabeto alienígena com N elementos, atribui-se números de 1 a N a cada um.

O problema é que o encarregado de transcrever os textos alienígenas para números nao foi muito
cuidadoso e usou o mesmo espaçamento entre dígitos e números. Assim, por exemplo, digamos que
para um alfabeto com 32 símbolos, uma sequencia que deveria ser "31 20 4 19" virou "3120419".
Como se pode notar, há diferentes maneiras válidas de interpretar essa sequencia além da original,
como por exemplo "3 1 20 4 19" e "31 20 4 1 9". Repare que a transcriçao nunca usa zeros a esquerda
de um número e, portanto, a sequencia "3 12 04 19" é inválida, assim como "31 20 41 9" por conter
um número (41) que nao corresponde a um símbolo.

Tarefa
Dados a quantidade de símbolos do alfabeto e uma sequencia transcrita, determine quantas sequencias
válidas podem ser formadas

Entrada
A entrada é composta por duas linhas. A primeira contém um número inteiro N (1 < N < 10 100 ) que
indica a quantidade de símbolos do alfabeto. A segunda linha contém uma cadeia de dígitos de
tamanho mínimo 1 e tamanho máximo 100.000 que corresponde a sequencia transcrita. .

Saída
Seu programa deve imprimir uma linha com o resto da divisao da quantidade de sequencias válidas por
1.000.000.007.

Exemplo
Entrada
323120419

Saída
4

Entrada
324021333251231253

1
Saída
0

Entrada
50012345

Saída
13

Added by: Wanderley Guimarăes


Date: 2011-04-28
Time limit: 1s
Source limit:50000B
Languages: All except: CLOJ ERL F# GO JS PERL 6 PYTH 3.1.2 SCALA TCL
Resource: OBI 2010 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

10864. Campo minado


Problem code: MINADO12
 

Leonardo Viana é um garoto fascinado por jogos de tabuleiro. Nas férias de janeiro, ele aprendeu um
jogo chamado "Campo minado", que é jogado em um tabuleiro com N células dispostas na horizontal.
O objetivo desse jogo é determinar, para cada célula do tabuleiro, o número de minas explosivas nos
arredores da mesma (que sao a própria célula e as células imediatamente vizinhas a direita e a
esquerda, caso essas existam). Por exemplo, a figura abaixo ilustra uma possível configuraçao de um
tabuleiro com 5 células:

A primeira célula nao possui nenhuma mina explosiva, mas é vizinha de uma célula que possui uma
mina explosiva. Nos arredores da segunda célula temos duas minas, e o mesmo acontece para a
terceira e quarta células; a quinta célula só tem uma mina explosiva em seus arredores. A próxima
figura ilustra a resposta para esse caso.

Leonardo sabe que voce participa da OBI e resolveu lhe pedir para escrever um programa de
computador que, dado um tabuleiro, imprima o número de minas na vizinhança de cada posiçao.
Assim, ele poderá conferir as centenas de tabuleiros que resolveu durante as férias.

Entrada
A primeira linha da entrada contém um inteiro N indicando o número de células no tabuleiro. O
tabuleiro é dado nas próximas N linhas. A i-ésima linha seguinte contém 0 se nao existe mina na
i-ésima célula do tabuleiro e 1 se existe uma mina na i-ésima célula do tabuleiro.

Saída
A saída é composta por N linhas. A i-ésima linha da saída contém o número de minas explosivas nos
arredores da i-ésima célula do tabuleiro.

1
Restriçoes
1 <= N <= 50

Exemplos
Entrada
5
0
1
1
0
1

Saída
1
2
2
2
1

Entrada
5
0
1
1
10Saída
1
2
3
21

Added by: Wanderley Guimarăes


Date: 2012-02-29
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 1 nível junior

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

10865. Corrida
Problem code: CORRID11
 

A escola de Joaozinho tradicionalmente organiza uma corrida ao redor do prédio. Como todos os
alunos sao convidados a participar e eles estudam em períodos diferentes, é difícil que todos corram ao
mesmo tempo.

Para contornar esse problema, os professores cronometram o tempo que cada aluno demora para dar
cada volta ao redor da escola, e depois comparam os tempos para descobrir a classificaçao final.

Sua tarefa é, sabendo o número de competidores, o número de voltas de que consistiu a corrida e os
tempos de cada aluno competidor, descobrir quem foi o aluno vencedor, para que ele possa receber
uma medalha comemorativa.

Entrada
A primeira linha da entrada contém dois inteiros N e M representando o número de competidores e o
número de voltas da corrida, respectivamente.

Cada uma das N linhas seguintes representa um competidor: a primeira linha representa o primeiro
competidor, a segunda linha representa o segundo competidor, e assim por diante. Cada linha contém
M inteiros representando os tempos em cada volta da corrida: o primeiro inteiro é o tempo da primeira
volta, o segundo inteiro é o tempo da segunda volta, e assim por diante.

Garante-se que nao houve dois competidores que gastaram o mesmo tempo para completar a corrida
inteira.

Saída
A saída consiste de um único inteiro, que corresponde ao número do competidor que ganhou a corrida.

Restriçoes
2 <= N <= 100
1 <= M <= 100
1 <= qualquer número da entrada que represente o tempo de uma volta <= 10 6

1
Exemplos
Entrada
2 1
5
7

Saída
1

Entrada
3 3
3 5 6
1 2 3
1 1 1

Saída
3

Neste exemplo, existem tres competidores numa corrida de tres voltas. Os tempos de cada competidor
em cada volta foram como na tabela a seguir.

Sendo assim, o vencedor foi o competidor 3 (com um tempo total de 3).

Added by: Wanderley Guimarăes


Date: 2012-02-29
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 1 nível junior

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

10866. Transporte
Problem code: TRANSP11
 

A Betalândia é um país que apenas recentemente se abriu para o comércio exterior e está preparando
agora sua primeira grande exportaçao. A Sociedade Betalandesa de Comércio (SBC) ficou
encarregada de conduzir a exportaçao e determinou que, seguindo os padroes internacionais, a carga
será transportada em conteineres, que sao, por sua vez, colocados em grandes navios para o transporte
internacional.

Todos os conteineres betalandeses sao identicos, medindo A metros de largura, B metros de


comprimento e C metros de altura. Um navio porta-conteineres pode ser visto como um retângulo
horizontal de X metros de largura e Y metros de comprimento, sobre o qual os conteineres sao
colocados. Nenhuma parte de conteiner pode ficar para fora do navio. Além disso, para possibilitar a
travessia de pontes, a altura máxima da carga no navio nao pode ultrapassar Z metros.

Devido a limitaçoes do guindaste utilizado, os conteineres só podem ser carregados alinhados com o
navio. Ou seja, os conteineres só podem ser colocados sobre o navio de tal forma que a largura e o
comprimento do conteiner estejam paralelos a largura e ao comprimento do navio, respectivamente.

A SBC está com problemas para saber qual a quantidade máxima de conteineres que podem ser
colocados no navio e pede sua ajuda. Sua tarefa, neste problema, é determinar quantos conteineres
podem ser carregados no navio respeitando as restriçoes acima.

Entrada
A entrada consiste de duas linhas. A primeira linha contém tres inteiros A, B e C que representam as
dimensoes dos conteineres, enquanto a segunda linha contém outros tres inteiros X, Y e Z que
representam as dimensoes do navio.

1
Saída
Seu programa deve imprimir apenas uma linha contendo um inteiro que indica a quantidade máxima
de conteineres que o navio consegue transportar.

Restriçoes
1 <= A, B, C, X, Y, Z <= 10 6
É garantido que a maior resposta será menor ou igual a 10 6

Exemplos
Entrada
1 1 1
1 1 1

Saída
1

Entrada
1 2 5
9 6 11

Saída
54

Entrada
1 2 12
6 9 10

Saída
0

Added by: Wanderley Guimarăes


Date: 2012-02-29
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 1 nível junior

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

10867. Calculadora
Problem code: CALCUL11
 

Solicitando Boas Contas (SBC) é uma organizaçao de inspeçao de calculadoras. Todos os fabricantes
procuram ter o selo de qualidade da SBC, que faz com que os clientes comprem o produto sem
preocupaçao com contas erradas.

Voce está encarregado de testar máquinas que fazem apenas operaçoes de multiplicaçao e divisao.
Além disso, o termo a ser digitado em cada operaçao (que dividirá ou multiplicará o número
atualmente exibido no visor) só pode conter um único dígito.

A calculadora exibe o número 1 quando ligada. Depois disso, o usuário pode digitar um número com
um único dígito e escolher se esse número deve multiplicar ou dividir o número exibido anteriormente;
o resultado da operaçao escolhida é entao exibido na calculadora. Pode-se repetir esse processo
indefinidamente.

Apesar de só podermos entrar com números inteiros de um dígito, o visor da calculadora permite
exibir números com múltiplos dígitos e até mesmo números fracionários.

Dada uma sequencia de operaçoes que foram realizadas nessa calculadora logo depois de ligada, sua
tarefa é conferir o resultado exibido.

Entrada
A primeira e única linha da entrada contém um inteiro N. Cada uma das próximas N linhas contém um
dígito e um caractere ’*’ ou ’/’, que representam uma operaçao realizada na calculadora.

Saída
Seu programa deve imprimir uma única linha contendo o resultado que deve ser exibido pela
calculadora ao final das operaçoes.

Restriçoes
1 <= N <= 100 000.
Os números informados sao inteiros entre 1 e 9.
O resultado final da conta é um número inteiro entre 1 e 2 30 .

1
Exemplos
Entrada
3
2 *
1 *
3 *

Saída
6

O usuário deseja calcular o resultado da seguinte expressao: 1 × 2 × 1 × 3. Note que a primeira


ocorrencia do número 1 vem do fato da calculadora mostrar inicialmente 1 ao invés de 0.
Entrada
3
2 /
3 /
6 *

Saída
1

Neste exemplo, o usuário deseja calcular o resultado da seguinte expressao: ((1/2)/3) × 6.


Entrada
11
9 *
9 *
9 *
9 *
9 *
9 *
9 *
9 *
9 *
9 *
9 /

Saída
387420489

Added by: Wanderley Guimarăes


Date: 2012-02-29
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível junior

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

10868. Chuva
Problem code: CHUVA11
 

Bob trabalha no OBM (Órgao Brasileiro de Metereologia), que é a organizaçao responsável pela
mediçao dos índices pluviométricos (quantidade de chuva acumulada) em todo o país. Eles sao muito
eficientes no que fazem, mas estao com um problema: eles nao sabem como proceder para calcular a
quantidade acumulada de chuva que caiu em cada regiao em dois períodos consecutivos, muito
embora eles saibam os dados de cada período separadamente.

Como a chefia do Órgao estava muito ocupada, acabou ficando a cargo de Bob, o estagiário, a tarefa
de implementar um programa que some, para cada regiao, a quantidade de chuva acumulada em dois
períodos consecutivos.

O mapa que o OBM usa é dividido em N×N regioes, sendo que para cada regiao, a cada período, é
determinado um número inteiro indicando a quantidade de chuva acumulada. A quantidade de chuva
acumulada total em cada regiao em dois períodos consecutivos é a soma das quantidades de chuva em
cada um dos períodos.

Mas como Bob é só um estagiário e nao está acostumado a fazer nada mais do que tirar cópias de
documentos, ele pediu sua ajuda para implementar o programa que calcula a quantidade de chuva
acumulada total nos dois períodos para cada uma das regioes, dadas as quantidades de chuva
acumulada em cada período para cadaregiao.

Entrada
A primeira linha da entrada contém um inteiro N indicando a dimensao dos dois mapas que devem ser
lidos. Nas próximas 2N linhas sao dados os dois mapas, cada mapa indicando a quantidade de chuva
acumulada nas regioes em um período. Cada mapa é descrito em N linhas consecutivas, cada linha
contendo N inteiros, sendo que cada inteiro indica a quantidade de chuva acumulada, no período, em
uma regiao.

Saída
A saída deverá conter N linhas, com N inteiros em cada linha, indicando a quantidade de chuva
acumulada total em cada uma das regioes nos dois períodos considerados.

1
Restriçoes
1 <= N <= 100.
0 <= quantidade de chuva acumulada em cada regiao de cada mapa <= 100.

Exemplos
Entrada
2
1 2
3 4
10 11
12 13

Saída
11 13
15 17

Entrada
3
1 1 1
1 2 2
1 2 3
3 2 1
2 2 1
1 1 1

Saída
4 3 2
3 4 3
2 3 4

Added by: Wanderley Guimarăes


Date: 2012-02-29
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível junior

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

10869. Gincana
Problem code: GINCAN11
 

Toda semana Juquinha tem aulas de ACM (Artes Cenicas e Musicais) no colégio em que estuda e,
recentemente, sua professora anunciou que haverá uma gincana no final do semestre. No entanto, os
times devem ser formados o mais breve possível para que os alunos possam ensaiar.

Cada time é constituído de um ou mais alunos, e cada aluno tem que pertencer a exatamente um time.
Além disso, os times nao podem ser formados de qualquer maneira: se um aluno é amigo de outro,
esses alunos devem estar no mesmo time. A professora entao pediu para que os alunos a informassem
das relaçoes de amizade na sala de aula.

Os alunos entao se numeraram de 1 até N e escreveram uma lista cujas linhas contém pares de
números. Se dois alunos cujos números sao i e j sao amigos, haverá ao menos uma linha contendo i e j
ou j e i na lista. Inversamente, se há uma linha contendo i e j na lista, entao os alunos cujos números
sao i e j sao amigos.

A professora entao recolheu a lista e, na próxima aula, deverá decidir que times formar. Ela está
pensando em formar o maior número possível de times e gostaria de saber quantos times ela formaria.
Ajude entao a professora escrevendo um programa que, dada a lista de amizades, determina qual o
maior número de times que ela pode formar.

Entrada
A primeira linha da entrada contém dois inteiros N e M que representam, respectivamente, o número
de alunos na turma e o número de linhas na lista.

As próximas M linhas contem a lista de amizades. Cada linha contém dois inteiros I e J separados por
exatamente um espaço.

Saída
Seu programa deve imprimir uma linha contendo o número máximo de times que podem ser formados
pela professora.

1
Restriçoes
1 <= N <= 1000.
0 <= M <= 5000.
1 <= I, J <= N.

Exemplos
Entrada
3 1
1 3

Saída
2

Entrada
7 6
1 6
6 4
5 2
3 7
2 3
7 2

Saída
2

Added by: Wanderley Guimarăes


Date: 2012-02-29
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível junior

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11001. Corrida
Problem code: CORR11
 

Todo ano, os habitantes da Mlogônia, apesar das crises internas, reúnem-se em torno de um esporte
que é a paixao nacional: as corridas de carros. A Grande Corrida anual é um enorme evento
organizado pela Associaçao de Corridas da Mlogônia (ACM), sendo amplamente televisionado e
reportado em jornais e revistas de todo o país. Os resultados da corrida sao tema principal das rodas de
conversa por semanas.

Por bastante tempo, os resultados da Grande Corrida eram compilados manualmente. Observadores
especializados iam a pista medir o tempo de cada um dos N carros, numerados de 1 a N, em cada uma
das M voltas, anotando entao os resultados em tabelas para posterior análise por parte das equipes e
dos jornalistas. Muitos erros eram introduzidos nesse processo, e a organizaçao decidiu informatizar
todo o sistema.

A ACM percebeu que o esforço necessário para a construçao do sistema seria grande, e optou por
contar com a ajuda de uma equipe de programadores. Percival foi contratado para escrever a parte do
software que determina quais foram os carros vencedores, mas está com dificuldades e pede sua ajuda.
A sua tarefa, neste problema, é determinar os tres carros melhor colocados, fornecidos os tempos que
cada carro levou para completar cada volta da corrida.

Entrada
A primeira linha da entrada contém dois inteiros N e M representando o número de carros e o número
de voltas da corrida, respectivamente.

Cada uma das N linhas seguintes representa um carro: a primeira linha representa o primeiro carro, a
segunda linha representa o segundo carro, e assim por diante. Cada linha contém M inteiros
representando os tempos em cada volta da corrida: o primeiro inteiro é o tempo da primeira volta, o
segundo inteiro é o tempo da segunda volta, e assim por diante.

Garante-se que nao houve dois carros que gastaram o mesmo tempo para completar a corrida inteira.

Saída
A saída consiste de tres linhas, contendo um único inteiro cada. A primeira linha contém o número do
carro que ganhou a corrida, a segunda contém o número do segundo colocado e a terceira contém o
número do terceiro colocado.

1
Restriçoes
3 <= N <= 100
1 <= M <= 100
1 <= qualquer número da entrada que represente o tempo de uma volta <= 10 6

Exemplos
Entrada
3 1
1
2
3

Saída
1
2
3

Entrada
5 2
3 7
2 5
1 1
15 2
2 2

Saída
3
5
2

Neste exemplo, existem 5 carros numa corrida de duas voltas. Os tempos de cada carro em cada volta
foram como na tabela a seguir.

Sendo assim, o vencedor foi o carro 3 (com um tempo total de 2), seguido pelo carro 5 (com um tempo
total de 4) e pelo carro 2 (com um tempo total de 7).

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - Fase 1 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11002. Progressoes aritméticas


Problem code: PAS11
 

Bob é um aluno do ensino médio que gosta muito de matemática. Na última aula ele aprendeu o que
sao Progressoes Aritméticas (PAs) e ficou fascinado por elas. Pelo que Bob entendeu, Progressoes
Aritméticas sao sequencias de números nas quais a diferença entre dois elementos consecutivos é
sempre igual a uma constante r, chamada de razao da PA.

Um exemplo de Progressao Aritmética de razao 2 é -1, 1, 3, 5. Além disso, toda sequencia com um ou
dois elementos é sempre uma Progressao Aritmética. Por outro lado, 5, 6, 8, 9, 10 nao é uma PA
porque a diferença entre elementos consecutivos nao é constante: a diferença entre os dois primeiros
elementos é 6-5 = 1, enquanto a diferença entre o terceiro e o segundo elementos é 8-6 = 2.

Bob percebeu que qualquer sequencia, mesmo que a mesma nao seja uma Progressao Aritmética, pode
ser quebrada em sequencias menores que sao PAs. Por exemplo, vimos que a sequencia 5, 6, 8, 9, 10
nao é uma PA, mas podemos quebrar ela entre o 6 e o 8 para obtermos as sequencias 5, 6 e 8, 9, 10,
que sao PAs. Note que nao existe como quebrar a sequencia em menos partes se quisermos ter apenas
PAs no fim do procedimento.

Bob é fascinado por programaçao mas ainda nao sabe programar muito bem, e por isso pediu sua
ajuda: ele nao está conseguindo descobrir como quebrar sequencias muito grandes de um jeito
eficiente; por isso, pediu que voce escrevesse um programa para, dada uma sequencia qualquer,
imprimir o número mínimo de partes em que precisamos quebrar a sequencia para termos apenas
Progressoes Aritméticas no término do processo. Caso a sequencia original já seja uma PA, podemos
terminar o processo com uma única parte, e portanto a resposta para esse caso é 1.

Entrada
A primeira linha da entrada é composta por um inteiro N, o número de elementos da sequencia. Na
segunda linha existem N inteiros a i , os elementos da sequencia.

Saída
A saída deve conter uma única linha, indicando o número mínimo de partes em que Bob precisa
quebrar a sequencia original para que ele termine apenas com PAs.

1
Restriçoes
1 <= N <= 10 5
-10 5 <= a i <= 10 5

Exemplos
Entrada
5
1 2 3 4 5

Saída
1

Entrada
7
-2 0 2 3 3 4 6

Saída
3

É fácil verificar que a sequencia -2, 0, 2, 3, 3, 4, 6 (do exemplo acima) nao é uma PA, pois 2-0 != 3-2.
Verificando manualmente, voce pode constatar que nao é possível particionar a sequencia em duas de
tal forma que ambas as partes sejam PAs. Entretanto, existe uma maneira de particionar a sequencia
em 3 PAs: [-2, 0, 2] [3, 3] [4, 6]. Portanto, temos que a resposta para este exemplo é 3.
Entrada
4
-2 0 3 6

Saída
2

A sequencia -2, 0, 3, 6 (do exemplo acima) pode ser particionada de várias formas. As únicas maneiras
que resultam em PAs sao as seguintes:

Com 4 partes temos 1 possibilidade:

[-2] [0] [3] [6]

Com 3 partes temos 3 possibilidades:

[-2, 0] [3] [6]

[-2] [0, 3] [6]

[-2] [0] [3, 6]

Com 2 partes temos 2 possibilidades:

[-2, 0] [3, 6]

[-2] [0, 3, 6]

2
Added by: Wanderley Guimarăes
Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 1 nível 1

3
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11003. Pulo do sapo


Problem code: PUSAPO11
 

Sebastiao Bueno Coelho, apelidado de SBC pelos familiares e amigos, passou as férias de janeiro de
2011 no sítio de seus avós. Durante sua estadia, uma das atividades prediletas do SBC era nadar no rio
que havia no fundo da casa onde morava.

Uma das características do rio que mais impressionava SBC era um belo caminho, feito inteiramente
com pedras brancas. Há muito tempo, o avô de SBC notara que os habitantes do sítio atravessavam o
rio com grande frequencia e, por isso, construiu um caminho no rio com pedras posicionadas em linha
reta; ao faze-lo, tomou muito cuidado para que o espaçamento das pedras fosse de exatamente um
metro.

Hoje em dia, a única utilidade do caminho é servir de diversao para os sapos que vivem no rio, que
pulam de uma pedra a outra agitadamente. Um certo dia, enquanto descansava e nadava nas águas,
SBC assistiu atentamente as acrobacias dos bichos e notou que cada sapo sempre pulava (zero, uma ou
mais vezes) uma quantidade fixa de metros.

SBC sabe que voce participa da OBI todos os anos e, chegando na escola, resolveu desafiar-te com o
seguinte problema: Dado o número de pedras no rio, o número de sapos, a pedra inicial sobre a qual
cada sapo está (cada pedra é identificada por sua posiçao na sequencia de pedras) e a distância que
cada sapo pula, determinar as posiçoes onde pode existir um sapo depois que SBC chega no rio.

Entrada
A primeira linha da entrada contém dois inteiros N e M representando o número de pedras no rio e o
número de sapos, respectivamente. Cada uma das M linhas seguintes possui dois inteiros P e D
representando a posiçao inicial de um sapo e a distância fixa de pulo, respectivamente.

Saída
A saída contém N linhas. A i-ésima linha indica a possibilidade ou nao de ter um sapo na i-ésima
pedra. Para as pedras que podem ter um sapo voce deve imprimir 1, e para as pedras que com certeza
nao podem ter nenhum sapo voce deve imprimir 0.

1
Restriçoes
1 <= N, M <= 100
Para cada sapo, 1 <= P, D <= N

Exemplos
Entrada
5 2
3 2
4 4

Saída
1
0
1
1
1

Neste exemplo, SBC indicou a existencia de 5 pedras no rio e 2 sapos. Os sapos estavam inicialmente
nas pedras 3 e 4. SBC também lhe disse que o primeiro sapo da entrada sempre pula 2 metros, e o
segundo sempre pula 4 metros. A figura a seguir ilustra as possíveis pedras que podem ser ocupadas
pelos sapos quando eles começam a pular.

Entrada
8 3
3 3
2 2
6 2

Saída
0
1
1
1
0
1
0
1

Neste exemplo, SBC indicou a existencia de 8 pedras no rio e 3 sapos. Os sapos estavam inicialmente
nas pedras 3, 2 e 6. SBC também lhe disse que o primeiro sapo da entrada sempre pula 3 metros, o
segundo e terceiro sempre pulam 2 metros. Dessa forma, o primeiro sapo pode estar nas pedras 3 ou 6;
o segundo sapo pode estar nas pedras 2, 4, 6 ou 8; e o terceiro sapo pode estar nas pedras 6, 4, 2 e 8. A
figura a seguir ilustra as possíveis pedras que podem ser ocupadas pelos sapos quando eles começam a
pular.

2
Added by: Wanderley Guimarăes
Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 1 nível 1

3
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11004. Triângulos
Problem code: TRIANG11
 

Caio estava brincando de construir triângulos com palitos de diferentes tamanhos. Ele fazia isso
juntando as pontas de tres palitos sobre uma mesa. Ele notou que podia agrupar os triângulos
formados em tres grupos:

Triângulos acutângulos, que sao aqueles em que todos os ângulos internos medem menos de 90°;
Triângulos retângulos, que sao aqueles que possuem um ângulo interno que mede exatamente
90°;
Triângulos obtusângulos, que sao aqueles que possuem um ângulo interno que mede mais de 90°.

Ele também percebeu que nem sempre é possível formar um triângulo com tres palitos.

Sua tarefa é, dados os comprimentos A, B e C de tres palitos, dizer se é possível formar um triângulo
com esses palitos e, em caso afirmativo, dizer a qual grupo o triângulo formado pertence.

Entrada
A entrada consiste de uma única linha, contendo tres inteiros A, B e C separados por espaço.

Saída
Imprima uma linha contendo apenas uma letra minúscula:

’n’ se nao for possível formar um triângulo;


’a’ se o triângulo formado for acutângulo;
’r’ se o triângulo formado for retângulo;

1
’o’ se o triângulo formado for obtusângulo.

Restriçoes
1 <= A <= 10 4
1 <= B <= 10 4
1 <= C <= 10 4

Exemplos
Entrada
1 1 1

Saída
a

Entrada
1 2 1

Saída
n

Entrada
5 4 3

Saída
r

Entrada
6 3 4

Saída
o

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 1 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11005. Calculadora
Problem code: CALCU11
 

Solicitando Boas Contas (SBC) é uma organizaçao de inspeçao de calculadoras. Todos os fabricantes
procuram ter o selo de qualidade da SBC, que faz com que os clientes comprem o produto sem
preocupaçao com contas erradas.

Voce está encarregado de testar máquinas que fazem apenas operaçoes de multiplicaçao e divisao.
Além disso, o termo a ser digitado em cada operaçao (que dividirá ou multiplicará o número
atualmente exibido no visor) só pode conter um único dígito.

A calculadora exibe o número 1 quando ligada. Depois disso, o usuário pode digitar um número com
um único dígito e escolher se esse número deve multiplicar ou dividir o número exibido anteriormente;
o resultado da operaçao escolhida é entao exibido na calculadora. Pode-se repetir esse processo
indefinidamente.

Apesar de só podermos entrar com números inteiros de um dígito, o visor da calculadora permite
exibir números com múltiplos dígitos e até mesmo números fracionários.

Dada uma sequencia de operaçoes que foram realizadas nessa calculadora logo depois de ligada, sua
tarefa é conferir o resultado exibido.

Entrada
A primeira e única linha da entrada contém um inteiro N. Cada uma das próximas N linhas contém um
dígito e um caractere ’*’ ou ’/’, que representam uma operaçao realizada na calculadora.

Saída
Seu programa deve imprimir uma única linha contendo o resultado que deve ser exibido pela
calculadora ao final das operaçoes.

Restriçoes
1 <= N <= 100 000.
Os números informados sao inteiros entre 1 e 9.
O resultado final da conta é um número inteiro entre 1 e 2 30 .

1
Exemplos
Entrada
3
2 *
1 *
3 *

Saída
6

O usuário deseja calcular o resultado da seguinte expressao: 1 × 2 × 1 × 3. Note que a primeira


ocorrencia do número 1 vem do fato da calculadora mostrar inicialmente 1 ao invés de 0.
Entrada
3
2 /
3 /
6 *

Saída
1

Neste exemplo, o usuário deseja calcular o resultado da seguinte expressao: ((1/2)/3) × 6.


Entrada
11
9 *
9 *
9 *
9 *
9 *
9 *
9 *
9 *
9 *
9 *
9 /

Saída
387420489

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11006. Colorindo
Problem code: COLOR11
 

A Sociedade Brasileira das Cores (SBC) é uma editora de livros de colorir. As crianças adoram os
livros da SBC porque suas figuras, depois de pintadas, ficam muito coloridas e bonitas. Isso acontece
porque a SBC se preocupa em nao deixar grandes regioes contínuas em suas figuras, que devem ser
pintadas com uma cor só.

Até agora, o processo de verificar se uma figura tinha uma regiao contínua grande era completamente
visual, mas a SBC resolveu automatizar esse processo e voce foi contratado para programar uma parte
desse sistema.

Uma figura é representada por uma grade, de dimensao N por M. Cada quadrado dessa grade é
representado por uma coordenada (i, j), com 1 <= i <= N e 1 <= j <= M. Por exemplo, a coordenada (1,
5) representa o quadrado na primeira linha e quinta coluna, enquanto que a coordenada (3, 7)
representa o quadrado na terceira linha e sétima coluna. As linhas sao contadas de baixo para cima e as
colunas da esquerda para a direita.

Cada quadrado pode estar vazio ou cheio. Assumimos que uma criança só vai pintar sobre quadrados
vazios e se ela pintar um quadrado de uma cor, ela irá pintar os oito vizinhos da mesma cor, desde que
eles estejam vazios e que ela nao saia da área da figura.

Dada a figura e a coordenada onde uma criança vai começar a pintar, sua tarefa é descobrir quantos
quadrados ela irá pintar.

Entrada
A primeira linha da entrada contém 5 números inteiros, N, M, X, Y e K. Os números inteiros N e M sao
respectivamente o número de linhas e colunas da grade, enquanto que (X, Y) é a coordenada onde a
criança vai começar a pintar e K é o número de quadrados cheios na figura.

Seguem-se K linhas, cada uma com dois inteiros A e B, que sao as coordenadas de um quadrado cheio.

Garantimos que o quadrado na posiçao (X, Y) está sempre vazio.

Saída
Seu programa deve imprimir uma linha contendo o número de quadrados pintados pela criança.

1
Restriçoes
1 <= N, M <= 200.
1 <= K <= 10 000.
1 <= X, A <= N.
1 <= Y, B <= M.

Exemplos
Entrada
1 5 1 2 2
1 1
1 4

Saída
2

Entrada
5 5 3 3 7
2 2
2 3
2 4
3 2
3 4
4 2
4 3

Saída
18

Neste exemplo de caso de teste, temos uma figura de dimensoes 5 × 5. A criança começa a pintar na
posiçao (3, 3). Na figura abaixo ilustramos este caso. A posiçao que a criança inicia está marcada com
a letra "X", e os quadrados que a criança consegue pintar estao destacandos em cinza claro. Note que
ela consegue pintar o quadrado (4, 4), pois este quadrado é um dos quadrados que ela consegue pintar
após ter pintado o quadrado (3, 3).

Entrada
10 10 5 5 22
2 2
2 3
2 4
2 5
2 6
2 7
2 8
3 2

2
3 8
4 2
4 8
5 2
5 8
6 2
6 8
7 2
7 3
7 4
7 5
7 6
7 7
7 8

Saída
20

Neste exemplo de caso de teste, temos uma figura de dimensoes 10 × 10. A criança começa a pintar na
posiçao (5, 5). Na figura abaixo ilustramos este caso. A posiçao que a criança inicia está marcada com
a letra "X", e os quadrados que a criança consegue pintar estao destacandos em cinza claro.

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível 1

3
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11007. Balé
Problem code: BALE11
 

Uma academia de balé irá organizar uma Oficina de Balé Intensivo (OBI) na Semana de Balé
Contemporâneo (SBC). Nessa academia, existem N bailarinas que praticam regularmente. O dono da
academia, por ser experiente, consegue medir o nível de habilidade de cada uma delas por um número
inteiro; nessa mediçao, números maiores correspondem a dançarinas mais habilidosas, e os números
obtidos sao todos distintos. Além disso, ele possui uma lista das bailarinas em ordem cronológica de
ingresso na academia: As bailarinas que aparecem primeiro na lista estao há mais tempo na academia,
e as que estao no final ingressaram mais recentemente.

O dono da academia decidiu escolher duas das bailarinas para ajudá-lo na realizaçao do evento: uma
ajudará no trabalho braçal, enquanto a outra irá exemplificar os passos de balé. Por seu
perfeccionismo, ele deseja que a bailarina que exemplificará os passos de dança seja, dentre as duas
meninas do par, a mais habilidosa e a que frequenta a academia há mais tempo.

Ele sabe que a Oficina será um sucesso desde que os dois critérios mencionados acima sejam
satisfeitos pela dupla de dançarinas escolhidas. Com isso, ele ficou curioso para saber quantas duplas
de dançarinas podem ajudá-lo na Oficina. A quantidade de dançarinas, contudo, é relativamente
grande e ele nao possui nem tempo nem paciencia para fazer tal cálculo. Como voces sao amigos, ele
pediu a sua ajuda para contar quantas duplas sao válidas. Voce pode ajudá-lo?

Por exemplo, digamos que a academia possua 5 dançarinas com níveis de habilidade 1, 5, 2, 4 e 3,
onde a primeira, que possui nível "1", está na academia há mais tempo e a última, que possui nível "3",
está há menos. Temos, entao, 4 possíveis duplas que poderemos usar nesta Oficina, que sao (5, 2),(5,
4),(5, 3) e (4, 3). Note que a dupla (1, 3), por exemplo, nao pode ser escolhida pelo dono da academia,
pois a mais habilidosa dentre as duas é também a mais nova da dupla.

Entrada
A primeira linha contém um número N, que representa a quantidade de dançarinas que estao
registradas na academia. A segunda linha da entrada contém N inteiros, onde o primeiro inteiro é o
nível da dançarina que está há mais tempo na academia, o segundo inteiro é o nível da próxima
dançarina mais antiga na academia (mas mais nova que a dançarina anterior), e assim sucessivamente.

1
Saída
A saída consistirá num único número X, que representa o total de duplas de dançarinas válidas para
essa Oficina, dadas as regras descritas anteriormente.

Restriçoes
1 <= N <= 100 000.
Todas as dançarinas possuirao níveis distintos, entre 1 e 100 000.
O total de pares válidos, em todos os casos, será <= 1 000 000.

Exemplos
Entrada
5
1 5 2 4 3

Saída
4

Entrada
9
9 8 7 6 5 4 3 1 2

Saída
35

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11008. Selos
Problem code: SELOS11
 

Euclides é um garoto que gosta muito de colecionar selos. No seu aniversário, seus pais o
presentearam com N selos, todos em formato de quadrados com 1 cm de lado. Euclides gostaria de
guardar todos os N selos que ganhou colando-os numa página de papel em branco. Ao decidir por
guardá-los assim, no entanto, ele logo percebeu que a única forma que lhe agradava de posicionar os
selos na página era a forma de um retângulo completamente coberto pelos mesmos, sem sobreposiçao.

Ele percebeu também que, independente do número de selos obtido, colocar todos os selos numa única
linha ou todos os selos numa única coluna é uma configuraçao válida. Como essa maneira usa a página
do caderno de um jeito muito ineficiente, Euclides gostaria de saber se existe algum modo de dispor os
N selos num retângulo que tenha mais de uma linha e mais de uma coluna tal que todas as linhas e
colunas sejam completamente ocupadas por selos (isto é, tal que nao existam posiçoes sem selos no
interior do retângulo).

Entrada
A entrada contém uma única linha com um único inteiro N, o número de selos que Euclides ganhou.

Saída
A saída deve conter uma linha com um único caracter, que deve ser ’S’ se for possível organizar os
selos em um retângulo com mais que uma linha e mais que uma coluna ou ’N’ caso nao seja possível.

Restriçoes
1 <= N <= 10 000 000 000.

Exemplos
Entrada
8

Saída
S

A figura abaixo exemplifica duas maneiras de guardar os selos em forma de retângulo.

1
Entrada
1

Saída
N

Entrada
11

Saída
N

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11009. O mar nao está para peixe


Problem code: PESCA11
 

Em um arquipélago no meio do Oceano Pacífico a economia é regida pela pesca, pois o peixe é o
principal alimento disponível. Ultimamente, a populaçao desse arquipélago tem aumentado
drasticamente, o que levou a um grande aumento da pesca, e, consequentemente, a problemas.

Neste arquipélago, cada pescador vai diariamente ao alto mar com a intençao de conseguir trazer o
maior número de peixes para o seu vilarejo. Com a expansao da pesca, os pescadores estao começando
a jogar suas redes de pesca por cima das de outros pescadores. Com isso, os pescadores perdem, pois
apenas o primeiro pescador pega os peixes da intersecçao entre as redes.

A Associaçao dos Pescadores da ilha decidiu fazer um levantamento para descobrir quanto do mar está
de fato sendo aproveitado, ou seja, qual a área do mar que está coberta por pelo menos uma rede de
pesca.

Como há muitas intersecçoes entre as redes de pesca, é muito difícil para a associaçao calcular a área
total da regiao coberta pelas redes. Por este motivo, eles pediram para que voce escrevesse um
programa para resolver este problema.

Como é muito difícil navegar pelo mar, os pescadores sempre jogam as redes de forma que as regioes
cobertas por cada rede sao sempre retângulos com lados paralelos aos eixos, se imaginarmos o mar
como um plano cartesiano.

Entrada
A primeira linha da entrada possui um inteiro N indicando o número de redes que foram lançadas. As
próximas N linhas descrevem as regioes cobertas pelas redes: cada uma contém quatro inteiros X i e X f
, Y i e Y f . A regiao coberta pela rede em questao contém todo ponto (X, Y) tal que X i <= X <= X f e Y i
<= Y <= Y f .

Saída
A saída deve conter apenas uma linha contendo a área da regiao do mar realmente aproveitada pelos
pescadores, ou seja, a área total da regiao do mar coberta por pelo menos uma rede de pesca.

1
Restriçoes
1 <= N <= 100
1 <= X i <= X f <= 100
1 <= Y i <= Y f <= 100

Exemplos
Entrada
2
1 3 1 3
2 4 2 4

Saída
7

Entrada
3
1 6 1 2
3 7 1 2
2 5 1 2

Saída
6

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 1 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11010. Caça ao tesouro


Problem code: TESOUR11
 

Capitao Tornado é um pirata muito cruel que faz qualquer coisa por dinheiro. Há alguns dias, o capitao
soube da existencia de um tesouro numa ilha deserta, e agora tenta determinar sua posiçao.

A ilha pode ser vista como um quadriculado N × N de terra cuja posiçao (0, 0) está a sudoeste, a
posiçao (N-1, 0) está a sudeste, a posiçao (0, N-1) está a noroeste e a posiçao (N-1, N-1) está a
nordeste. Em alguma posiçao desse quadriculado está o tesouro.

Uma curiosidade importante é a perna de pau que o capitao possui. Ela impede que o capitao se
locomova em direçoes que nao a horizontal ou a vertical: para ir da posiçao (1, 1) para a posiçao (3, 2),
por exemplo, o capitao é obrigado a gastar tres passos. É claro que o capitao sempre escolhe, dentro de
suas limitaçoes, um caminho com o menor número de passos possível. Chamamos esse modo de andar
de passos de capitao. Um exemplo de caminho por passos de capitao entre (1, 1) e (3, 2) é ilustrado na
figura a seguir.

Como em toda boa caça ao tesouro, o capitao nao conhece a posiçao onde o tesouro se encontra: ele
possui um mapa que corresponde a geografia da ilha. Em algumas posiçoes desse mapa, existem pistas
escritas. Cada pista consiste em um número D, que indica a menor distância em passos de capitao
entre a posiçao em que a pista se encontra e a do tesouro.

1
Observe que, dependendo da disposiçao das pistas, a posiçao do tesouro pode estar determinada de
maneira única ou nao. Na figura acima e a esquerda, as duas pistas sao suficientes para se saber, com
certeza, onde está o tesouro; na figura a direita, as quatro pistas dadas ainda possibilitam que tanto a
posiçao (0, 2) quanto a (2, 2) guardem o tesouro. Nesse último caso, nao se pode determinar, com
certeza, qual é a localizaçao do tesouro.

Dadas as pistas que o capitao possui, sua tarefa é determinar se as pistas fornecem a localizaçao exata
do tesouro e, caso positivo, qual ela é.

Entrada
A primeira linha contém dois inteiros positivos N e K, onde N é a dimensao do quadriculado e K é o
número de pistas no mapa que o capitao possui.

Cada uma das próximas K linhas contem tres inteiros X, Y e D, informando que existe uma pista na
posiçao (X, Y) contendo o número D. Essa pista indica que o tesouro encontra-se a D passos de capitao
da posiçao da pista.

É garantido que, com essas pistas, existe ao menos uma localizaçao possível para o tesouro. Além
disso, o mapa nao contém duas pistas na mesma posiçao.

Saída
Se as pistas forem suficientes para determinar com certeza a localizaçao do tesouro, seu programa
deve imprimir uma única linha com dois inteiros, X e Y , indicando que o tesouro encontra-se na
posiçao (X, Y).

Caso contrário, seu programa deve imprimir uma única linha com dois inteiros iguais a -1, como nos
exemplos de saída a seguir.

Restriçoes
2 <= N <= 100
1 <= K <= 100

2
Exemplos
Entrada
4 2
0 0 3
3 0 4

Saída
1 2

Entrada
4 4
1 0 3
1 1 2
1 2 1
1 3 2

Saída
-1 -1

Entrada
3 3
0 0 2
1 1 2
2 0 4

Saída
0 2

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 1 nível 2

3
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11011. Desafio cartográfico


Problem code: CARTOG11
 

Leonardo Nascimento é um garoto de 13 anos apaixonado por cartografia. Ele assina a lista de
discussoes da Sociedade Brasileira de Cartografia (SBC) para ficar por dentro de todas as novidades.
Em um tópico de discussao na lista da SBC, o presidente da sociedade descobriu que Leonardo tinha
apenas 13 anos, e ficou muito feliz em saber que uma pessoa tao jovem tinha tanto interesse pela arte
de traçar mapas geográficos e topográficos. Foi entao que o presidente resolveu criar desafios com
intuito de difundir a cartografia.

Um dos desafios era o seguinte: dado um mapa de cidades ligadas por estradas, determinar a distância
entre um par de cidades mais distantes. Como o objetivo era fazer as crianças se divertirem, o
presidente resolveu selecionar mapas bem simples. As restriçoes adotadas foram: (a) todas as estradas
sao de mao dupla; (b) todas as estradas possuem 1km de comprimento, e portanto toda estrada ligando
duas cidades tem o mesmo comprimento; (c) toda estrada conecta apenas duas cidades, e (d) dadas
duas cidades quaisquer A e B, só existe uma única maneira de chegar em A partindo de B, e vice-versa.

O presidente da SBC resolveu pedir sua ajuda para escrever um programa de computador que, dado
um mapa seguindo as restriçoes acima, devolva a resposta. Assim, ele conseguirá gerar um gabarito
para enviar junto com o desafio.

Entrada
A primeira linha da entrada contém um inteiro N representando o número de cidades no mapa. Cada
uma das N-1 linhas seguintes da entrada contém dois inteiros A e B indicando que existe uma estrada
entre as cidades A e B.

Saída
A única linha da saída contém um inteiro indicando a distância entre um par de cidades mais distantes.

Restriçoes
2 <= N <= 10 6
1 <= A, B <= N e A != B

1
Exemplos
Entrada
10
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10

Saída
9

Entrada
5
1 2
2 3
3 4
3 5

Saída
3

A figura abaixo ilustra este exemplo, onde temos 5 cidades identificadas por 1, 2, . . . , 5. As cidades 1
e 4 estao a uma distância de 3km, assim como as cidades 1 e 5. Nao temos nenhum par de cidades que
estao a uma distância maior que 3km. Portanto, a resposta para esse caso é 3.

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s-9s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 1 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11012. Quadrado aritmético


Problem code: QUADRA11
 

Arnaldo e Bernardo sao dois garotos que compartilham um peculiar gosto por curiosidades
matemáticas. Nos últimos tempos, sua principal diversao tem sido investigar propriedades
matemágicas de tabuleiros quadrados preenchidos com inteiros. Um belo dia, Arnaldo desenhou o
tabuleiro da seguinte figura.

-- Olha só, várias somas nesse quadrado sao iguais! -- exclamou Bernardo.

-- Como assim? -- devolveu, intrigado, Arnaldo.

-- Observe:

-- É mesmo! (-41) + 40 + 54 dá 53, 28 + (-29) + 54 também! -- exclamou Arnaldo.

-- Eu já verifiquei: existem 6 formas de escolhermos 3 células deste quadrado de forma que cada linha
e coluna tenha exatamente uma célula escolhida. Em todas elas, a soma dá 53. Além disso, todos os
números sao distintos nesse quadrado. -- notou Bernardo, exibindo suas habilidades aritméticas.

1
-- Que bacana! Esse quadrado é realmente mágico! Ou, melhor, esse quadrado é realmente aritmético!
Será que existem mais quadrados como esse?

Uma escolha legal de células é uma escolha em que toda linha e toda coluna tenha exatamente uma
célula escolhida. Um quadrado aritmético de tamanho N e soma S é um tabuleiro de inteiros de N
linhas e N colunas em que qualquer escolha legal tem soma S e em que todos os números sao distintos.

Sua tarefa, neste problema, é gerar um quadrado aritmético de tamanho N e soma S, dados N e S.
Como Arnaldo e Bernardo vao querer conferir a sua soluçao em suas calculadoras, voce nao deve
gerar um quadrado em que alguma célula tenha valor absoluto maior do que 10 9 .

Entrada
A primeira e única linha da entrada contém dois números inteiros N e S (1 <= N <= 1000 e -1000 <= S
<= 1000) representando, respectivamente, o tamanho e a soma do quadrado aritmético pedido.

Saída
Seu programa deve imprimir N linhas, cada uma com N inteiros entre -10 9 e 10 9 , representando o
quadrado aritmético pedido. Para uma mesma entrada, podem existir vários quadrados aritméticos
válidos; seu programa deve imprimir qualquer um deles, mas apenas um.

É garantido que existirá pelo menos um quadrado aritmético válido para cada entrada testada.

Restriçoes
1 <= N <= 1000
-1000 <= S <= 1000
-10 9 <= valor de cada célula <= 10 9

Exemplos
Observe que, neste problema, para uma mesma entrada, podem existir várias saídas corretas. As saídas
abaixo indicam apenas uma de várias potenciais soluçoes. Contanto que sua saída seja um quadrado
aritmético válido segundo as condiçoes do enunciado, sua soluçao será considerada correta, mesmo
que nao seja igual aos exemplos indicados abaixo.
Entrada
2 49

Saída
23 40
9 26

Entrada
3 53

Saída
-41 -29 2
28 40 71
11 23 54

Entrada

2
1 -55

Saída
-55

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s-3s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 1 nível 2

3
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11013. Quadrado mágico


Problem code: MAGICO11
 

Arnaldo e Bernardo sao dois garotos que compartilham um peculiar gosto por curiosidades
matemáticas. Nos últimos tempos, sua principal diversao tem sido investigar propriedades
matemágicas de tabuleiros quadrados preenchidos com inteiros. Recentemente, durante uma aula de
matemática, os dois desafiaram os outros alunos da classe a criar quadrados mágicos, que sao
quadrados preenchidos com números de 1 a N 2 , de tal forma que a soma dos N números em uma
linha, coluna ou diagonal principal do quadrado tenham sempre o mesmo valor. A ordem de um
quadrado mágico é o seu número de linhas, e o valor do quadrado mágico é o resultado da soma de
uma linha. Um exemplo de quadrado mágico de ordem 3 e valor 15 é mostrado na figura abaixo:

Para surpresa de Arnaldo e Bernardo, os outros alunos criaram um grande número de quadrados,
alguns enormes, e alegaram que todos eram quadrados mágicos. Arnaldo e Bernardo agora precisam
de sua ajuda, para verificar se os quadrados criados sao realmente mágicos.

Voce deve escrever um programa que, dado um quadrado, verifique se ele é realmente mágico.

Entrada
A primeira linha da entrada contém um único número inteiro N, indicando a ordem do quadrado (seu
número de linhas). As N linhas seguintes descrevem o quadrado. Cada uma dessas linhas contém N
números inteiros separados por um espaço em branco.

Saída
Seu programa deve imprimir uma única linha. Caso o quadrado seja mágico, a linha deve conter o
valor do quadrado (ou seja, a soma de uma de suas linhas). Caso contrário, a linha deve conter o
número 0.

1
Restriçoes
3 <= N <= 1000.
1 <= valor de cada célula <= 10 9 .

Exemplos
Entrada
3
1 1 1
1 1 1
1 1 1

Saída
0

Entrada
4
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1

Saída
34

Entrada
3
4 8 9
11 7 3
6 5 10

Saída
0

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11014. Expressoes
Problem code: EXPRES11
 

Pedrinho e Zezinho estao precisando estudar resoluçao de expressoes matemáticas para uma prova que
irao fazer. Para isso, eles querem resolver muitos exercícios antes da prova. Como sabem programar,
entao decidiram fazer um gerador de expressoes matemáticas.

O gerador de expressoes que eles criaram funciona em duas fases. Na primeira fase é gerada uma
cadeia de caracteres que contém apenas os caracteres ’{’, ’[’, ’(’, ’}’, ’]’ e ’)’. Na segunda fase, o
gerador adiciona os números e operadores na estrutura criada na primeira fase. Uma cadeia de
caracteres é dita bem definida (ou válida) se atende as seguintes propriedades:

1. Ela é uma cadeia de caracteres vazia (nao contém nenhum caractere).

2. Ela é formada por uma cadeia bem definida envolvida por parenteses, colchetes ou chaves.
Portanto, se a cadeia S é bem definida, entao as cadeias (S), [S] e {S} também sao bem definidas.

3. Ela é formada pela concatenaçao de duas cadeias bem definidas. Logo, se as cadeias X e Y sao
bem definidas, a cadeia XY é bem definida.

Depois que Pedrinho e Zezinho geraram algumas expressoes matemáticas, eles perceberam que havia
algum erro na primeira fase do gerador. Algumas cadeias nao eram bem definidas. Eles querem
começar a resolver as expressoes o mais rápido possível, e sabendo que voce é um ótimo programador
(e participa da OBI) resolveram pedir que escreva um programa que dadas várias cadeias geradas na
primeira fase, determine quais delas sao bem definidas e quais nao sao.

Entrada
A entrada é composta por diversas instâncias. A primeira linha da entrada contém um inteiro T
indicando o número de instâncias. Em seguida temos T linhas, cada uma com uma cadeia A.

Saída
Para cada instância imprima uma linha contendo a letra S se a cadeia é bem definida, ou a letra N caso
contrário.

1
Restriçoes
1 <= T <= 20.
a cadeia de caracteres A tem entre 1 e 100000 caracteres.
a cadeia de caracteres A contém apenas caracteres ’{’, ’[’, ’(’, ’}’, ’]’ e ’)’.

Exemplos
Entrada
12
()
[]
{}
(]
}{
([{}])
{}()[]
()]
{[]
(
(([{}{}()[]])(){}){}
(((((((((({([])}])))))))))

Saída
S
S
S
N
N
S
S
N
N
N
S
N

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11015. Escalonamento ótimo


Problem code: ESCALO11
 

O SBC (System for Batch Computing) é um sistema operacional voltado para a execuçao sequencial de
tarefas. O operador do sistema cria tarefas e o sistema operacional é responsável por agendar a
execuçao destas tarefas.

Cada tarefa pode depender da conclusao de algumas tarefas para poder começar. Se uma tarefa A
depende de uma tarefa B, a tarefa B deve terminar antes que a tarefa A inicie sua execuçao.

Além disto, cada tarefa possui uma prioridade. É sempre mais vantajoso para o sistema começar
executando uma tarefa de mais alta prioridade, depois continuar executando uma tarefa de mais alta
prioridade dentre as que sobraram e assim por diante.

Neste problema, será dado um inteiro N, que irá representar o número de tarefas no sistema. As tarefas
serao numeradas de 0 até N-1. Tarefas com índice menor possuem prioridade maior, de forma que a
tarefa 0 é a tarefa de mais alta prioridade, a tarefa 1 é a tarefa com a segunda maior prioridade e assim
por diante, até a tarefa N-1, que é a tarefa com a menor prioridade. Além disso, serao dadas M relaçoes
de dependencia entre as tarefas.

Seu objetivo será decidir se é possível executar as tarefas em alguma ordem. Caso seja possível, voce
deverá produzir uma ordem de execuçao ótima para as tarefas, isto é, desempate as ordens possíveis
pela prioridade da primeira tarefa. Se o empate ainda persistir, desempate pela prioridade da segunda
tarefa, e assim por diante.

Entrada
A primeira linha da entrada contém inteiros N e M. As próximas M linhas descrevem, cada uma, uma
dependencia entre as tarefas da entrada. Cada uma dessas linhas irá conter dois inteiros A e B que
indicam que a tarefa B depende da tarefa A, isto é, que a tarefa A deve terminar antes que a tarefa B
inicie.

Saída
Se nao for possível ordenar as tarefas de forma que as dependencias sejam satisfeitas, imprima uma
única linha contendo o caracter "*". Caso contrário, imprima N linhas contendo cada uma um número
inteiro. O inteiro na i-ésima linha deve ser o índice da i-ésima tarefa a ser executada na ordem ótima
de execuçao das tarefas.

1
Restriçoes
0 <= N <= 50000.
0 <= M <= 200000.
0 <= A, B < N.

Exemplos
Entrada
3 1
2 0

Saída
1
2
0

Entrada
2 2
0 1
1 0

Saída
*

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11016. Reduzindo detalhes em um mapa


Problem code: RMAPA11
 

Leonardo Nascimento é um garoto de 13 anos apaixonado por cartografia. Durante as férias de janeiro
de 2011, ele alternava seu tempo entre navegar na internet (pesquisando sobre mapas) e arrumar sua
coleçao de mapas. Navegando na internet, Leonardo descobriu um site especializado em mapas, o
Google Maps. Depois de alguns dias usando o site, Leonardo percebeu que quando diminuía o zoom
algumas ruas nao eram mais exibidas no mapa, isto é, o zoom determinava também o nível de detalhe
do mapa. A figura abaixo ilustra um dos testes feito por Leonardo.

Ele sabe que voce participa da OBI e que voce adora resolver os problemas que envolvem mapas.
Entao resolveu formular o seguinte problema: dado um mapa de cidades e rodovias que as ligam,
selecione um subconjunto das rodovias tal que entre qualquer par de cidades exista uma rota
ligando-as e a soma dos comprimentos das rodovias é mínimo. Na figura abaixo e a esquerda temos
um exemplo com cinco cidades e seis rodovias ligando-as. A figura abaixo e a direita ilustra uma
soluçao cuja soma dos comprimentos é 34.

1
Para facilitar um pouco sua vida, Leonardo determinou que voce só precisa dizer a soma dos
comprimentos das rodovias do subconjunto selecionado para um dado mapa.

Entrada
A primeira linha da entrada contém dois números N e M que representam o número de cidades e o
número de rodovias respectivamente. Cada uma das próximas M linhas é composta por tres inteiros U,
V e C que indiciam que existe uma rodovia de comprimento C que liga as cidades U e V.

Saída
A saída consiste em apenas uma linha contendo a soma do comprimento das rodovias selecionadas.

Restriçoes
1 <= N <= 500.
1 <= M <= 124750.
1 <= U, V <= N e U != V .
1 <= C <= 500.

Exemplos
Entrada
5 6
1 2 15
1 3 10
2 3 1
3 4 3
2 4 5
4 5 20

Saída
34

Entrada
4 6
1 2 1
1 3 10
1 4 1
2 3 1
2 4 10
3 4 1

Saída
3

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11017. Vira!
Problem code: VIRA11
 

Vira! é um jogo individual que se inicia com N peças igualmente espaçadas em uma linha. Cada peça
do Vira! possui dois lados, sendo um branco e um preto; assim, ao virar uma peça, alterna-se a cor que
está sendo mostrada entre branco e preto. A figura abaixo ilustra um possível arranjo com 5 peças,
duas mostrando o lado branco e duas mostrando o lado preto.

Um movimento consiste em retirar uma peça preta - criando um espaço - e inverter as peças vizinhas a
retirada. Sendo assim, dependendo do número de peças vizinhas a retirada, um movimento pode
inverter duas, uma, ou mesmo nenhuma peça (se nao houver peças vizinhas a que está sendo retirada).
Voce vence o jogo quando consegue remover todas as peças. A figura abaixo exemplifica uma
sequencia de movimentos que resolvem uma instância do problema com 5 peças, em que as peças sao
retiradas na ordem 5-2-1-3-4.

Para uma determinada disposiçao inicial das peças, podem existir várias soluçoes diferentes. Por
exemplo, poderíamos retirar as peças na ordem 5-2-3-4-1 e ainda assim conseguir retirar todas as
peças.

Sua tarefa, neste problema, consiste em contar o número de soluçoes diferentes para uma dada
disposiçao inicial das peças. Como o número de soluçoes pode ser muito grande, voce deve imprimir
apenas o resto do número quando dividido por 10007.

1
Entrada
A primeira linha da entrada contém o inteiro N. A linha seguinte contém N letras separadas por espaço
representando o arranjo inicial das peças. Uma peça branca é indicada pela letra B na entrada, e uma
peça preta é indicada pela letra P.

Saída
Seu programa deve imprimir uma linha contendo o número de soluçoes distintas que resolvem o jogo.

Restriçoes
1 <= N <= 1000.

Exemplos
Entrada
5
B P B P P

Saída
11

Entrada
3
B P B

Saída
2

Added by: Wanderley Guimarăes


Date: 2012-03-10
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2011 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11628. Bactérias
Problem code: BACT09
 

Bruno é um biólogo apaixonado por sua profissao. Sua especialidade é estudar o comportamento de
bactérias. Por isso, ele possui em seu laboratório centenas de colônias de diferentes tipos desses
microorganismos.

Nesta semana ele viu o anúncio de um evento inusitado: uma feira de bactérias. Nessa feira, vários
fornecedores estarao vendendo diferentes tipos de bactérias. Cada tipo de bactéria é vendido em uma
placa de vidro, já preparada para a formaçao de uma colônia de bactérias. Cada placa de vidro é
vendida com apenas uma bactéria inicialmente.

Bruno deu uma olhada no catálogo com os tipos de bactérias que estarao a venda na feira, e notou
algumas coisas interessantes:

Todos os tipos de bactérias a venda terao o mesmo preço.


Todas as bactérias (de todos os tipos) se subdividem todas as noites para gerar outras bactérias.
Por exemplo, a bactéria da colônia de tipo X se subdivide em 2 outras bactérias todas as noites.
Assim, no primeiro dia teremos só uma bactéria na colônia. No dia seguinte, teremos 2, e no
próximo, 4. A quantidade de divisoes de uma bactéria depende do seu tipo.
O crescimento da colônia cessa após um determinado número de dias, por causa da escassez de
alimento. A quantidade de dias em que uma colônia cresce depende do tipo de bactéria.

É final de mes e Bruno já gastou quase todo o seu dinheiro. Assim, resolveu que irá comprar apenas
uma colônia de bactérias. No entanto, ele pretende comprar a colônia que forneça a maior quantidade
de bactérias ao final do período de crescimento da mesma.

Ele tem um catálogo mostrando os tipos de bactérias a venda. Para cada tipo de bactéria, o catálogo
informa a quantidade de bactérias geradas por uma bactéria desse tipo a cada divisao e por quantos
dias a populaçao da colônia crescerá. Porém, a calculadora que ele tem em casa nao é suficiente para
que ele faça os cálculos necessários para decidir qual é a melhor colônia a comprar.

Tarefa
Bruno pediu sua ajuda para decidir qual é o melhor tipo de bactéria para a compra. Lembre que para
Bruno o melhor tipo de bactéria é aquele cuja colônia, ao final do período de crescimento, terá a maior
quantidade de bactérias.

1
Voce deve supor que nao haverá duas colônias com a mesma populaçao final de bactérias.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha da entrada contém um inteiro N (1 <= N <= 50.000) representando a quantidade tipos
de bactérias no catálogo. Cada uma das N linhas seguintes contém informaçoes sobre um tipo de
bactéria: a primeira dessas linhas contém a informaçao da bactéria de tipo 0, a segunda dessas linhas
contém a informaçao sobre a bactéria de tipo 1, e assim por diante. A última dessas linhas contém a
informaçao da bactéria de tipo N - 1.

A informaçao para cada tipo de bactéria é composta por dois números inteiros D e C (1 <= D <= 2.000
e 1 <= C <= 5.000), onde D é quantidade de bactérias que cada bactéria deste tipo gera ao se dividir
numa noite, e C é a quantidade de dias que a populaçao de bactérias crescerá.

Saída
Seu programa deve imprimir, na saída padrao, um número inteiro entre 0 e N - 1 representando o tipo
da bactéria que Bruno deverá comprar.

Exemplos
Entrada
2
2 5
3 4

Saída
1

Entrada
5
2 1
4 5
30 4
20 6
2 154

Saída
4

Entrada
4
145 15
2 4999
3 3211
135 20

Saída
2

2
Added by: Wanderley Guimarăes
Date: 2012-05-30
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 1 nível 1

3
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11629. Competiçăo de chocolate


Problem code: CHOCPJ09
 

Carlos e Paula acabaram de ganhar um saco com bolinhas de chocolate. Como sabem que vao comer
tudo muito rápido inventaram uma brincadeira:

Eles vao comer de forma alternada, um depois o outro, sendo que sempre a Paula começa.
Quem comer a última bolinha ganha a bricadeira.
A cada vez, só se pode comer de 1 a M bolinhas, sendo o M decidido pela mae de Paula, de forma
que nao engasguem com o chocolate.

Um exemplo de partida para M = 5, onde Paula ganhou:

Ambos sao muito espertos e jogam de maneira ótima, de forma que se existe para um deles uma
sequencia de jogadas que garante a vitória independente da jogada do outro, essa pessoa jogará dessa
forma.

Tarefa
Sua tarefa é determinar quem vai ganhar a brincadeira, se ambos jogam de forma ótima.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A entrada consiste de uma linha contendo dois inteiros N (1 <= N <= 10 6 ) e M (1 <= M <= 10 3 ),
sendo N o número de bolinhas de chocolate e M o número de bolinhas permitidas por vez.

1
Saída
Seu programa deve imprimir, na saída padrao, uma linha, contendo o nome do vencedor, como
exemplificado abaixo.

Exemplos
Entrada
5 3

Saída
Paula

Entrada
30 5

Saída
Carlos

Added by: Wanderley Guimarăes


Date: 2012-05-30
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 2 nível júnior

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11630. Competiçăo de chocolate


Problem code: CHOC09
 

Carlos e Paula acabaram de ganhar um saco com bolinhas de chocolate. Como sabem que vao comer
tudo muito rápido inventaram uma brincadeira:

Eles vao comer de forma alternada, um depois o outro, sendo que sempre a Paula começa.
A cada vez, só se pode comer de 1 a M bolinhas, sendo o M decidido pela mae de Paula, de forma
que nao engasguem com o chocolate.
Se um comeu K bolinhas em sua vez, o próximo nao pode comer o mesmo tanto, tendo que
comer um número de bolinhas distinto.
Quem nao puder mais jogar de maneira válida perde.

Um exemplo de partida para M = 5 e 20 bolinhas, onde Carlos ganhou:

Observe que no final Carlos nao poderia comer 2 bolinhas para ganhar, pois seria o mesmo que Paula
comeu na vez anterior. Mas Paula também nao pôde comer a última bolinha, pois Carlos havia comido
apenas uma na rodada anterior, assim Paula ficou sem opçao de jogada e perdeu.

Ambos sao muito espertos e jogam de maneira ótima, de forma que se existe para um deles uma
sequencia de jogadas que garante a vitória independente da jogada do outro, essa pessoa jogará dessa
forma.

Tarefa
Sua tarefa é determinar quem vai ganhar a brincadeira, se ambos jogam de forma ótima.

1
Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A entrada consiste de uma linha contendo dois inteiros N (2 <= N <= 10 6 ) e M (2 <= M <= 10 3 ),
sendo N o número de bolinhas de chocolate e M o número de bolinhas permitidas por vez.

Saída
Seu programa deve imprimir, na saída padrao, uma linha, contendo o nome do vencedor, como
exemplificado abaixo.

Exemplos
Entrada
5 3

Saída
Paula

Entrada
20 5

Saída
Carlos

Entrada
5 6

Saída
Paula

Added by: Wanderley Guimarăes


Date: 2012-05-30
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 2 nível 1 e 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11631. Número de Envelopes


Problem code: ENVEL09
 

Aldo é um garoto muito esperto que adora promoçoes e sorteios. Como já participou de muitas
promoçoes da forma "para participar, envie n rótulos de produtos ...", Aldo tem o costume de guardar
o rótulo de todos os produtos que compra. Dessa forma, sempre que uma empresa faz uma promoçao
ele já tem um monte de rótulos para mandar.

A SBC (Super Balas e Caramelos) está fazendo uma nova promoçao, e, como era de se esperar, Aldo
quer participar. Para participar da promoçao é preciso enviar um envelope contendo um rótulo de cada
tipo de bala que a SBC produz. Por exemplo, se a SBC produz 3 tipos de balas, A, B, C, e uma pessoa
tem 3 rótulos de A, 3 de B e 2 de C, ela pode enviar no máximo 2 envelopes, já que falta um rótulo de
C para compor o terceiro envelope. Nao há limite para o número de envelopes que uma pessoa pode
enviar.

Balas sao a segunda coisa de que Aldo mais gosta (a primeira como voce sabe sao promoçoes). Por
causa disso a quantidade de rótulos de balas que ele tem é muito grande, e ele nao está conseguindo
determinar a quantidade máxima de envelopes que ele pode enviar.

Como voce é o melhor amigo de Aldo ele pediu sua ajuda para fazer o cálculo, de modo que ele
compre o número exato de envelopes.

Tarefa
Voce deve escrever um programa que, a partir da lista de rótulos de Aldo, calcula o número máximo
de envelopes válidos que ele pode enviar.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha contém dois números inteiros N (1 <= N <= 1000000) e K (1 <= K <= 1000)
representando respectivamente a quantidade de rótulos de balas que Aldo possui e o número de tipos
diferentes de bala que a SBC produz. Os tipos de balas sao identificados por inteiros de 1 a K. A
segunda linha contém N números inteiros X i , cada um representando um rótulo de bala que Aldo
possui (1 <= X i <= K, para 1 <= i <= N).

1
Saída
Seu programa deve imprimir, na saída padrao, o número máximo de envelopes válidos que Aldo pode
enviar.

Exemplos
Entrada
10 2
1 1 1 1 1 2 2 2 2 2

Saída
5

Entrada
20 5
1 2 3 4 1 2 3 4 1 2 3 4 5 1 2 3 4 5 4 4

Saída
2

Added by: Wanderley Guimarăes


Date: 2012-05-31
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 1 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11636. O fugitivo
Problem code: FUGIT09
 

Demasi é um terrorista e mafioso italiano que tentou escapar vindo para o Brasil. Mas Demasi nao
contava com a astúcia de nossa polícia, e acabou sendo preso aqui também.

Por ser mafioso, Demasi conseguiu contratar advogados muito bons, que através de muitos recursos na
justiça, acabaram conseguindo uma liberdade condicional para ele.

Nessa liberdade condicional, Demasi deve permanecer a uma certa distância da delegacia de polícia
responsável por ele. Para monitorá-lo melhor, eles instalaram nele uma coleira eletrônica inquebrável
que, minuto a minuto, envia para uma central as movimentaçoes de Demasi naquele momento.

A informaçao da coleira é enviada indicando uma direçao e uma distância. Por exemplo, em quatro
minutos chegam as quatro linhas de informaçao abaixo:
N 30
O 44
S 22
L 10

Isso significa que no primeiro minuto Demasi se deslocou 30 metros para o norte (letra N), no minuto
seguinte andou 44 metros para o oeste (letra O), no outro minuto andou 22 metros para o sul (letra S) e
no quarto minuto se deslocou 10 metros para o leste (letra L). Para poder dar um castigo ao terrorista,
o juiz decidiu que Demasi só poderia andar nas quatro direçoes citadas acima. Ou seja, Demasi nunca
se movimenta na direçao noroeste, por exemplo. Neste problema, voce pode supor que todos os
movimentos de Demasi ocorrem sobre um plano cartesiano.

A polícia precisa estar sempre atenta a movimentaçao dele, e pede a sua ajuda para verificar se em
algum momento o italiano se desloca a uma distância da delegacia maior do que a permitida. A
distância considerada para esta medida é a distância euclidiana.

Tarefa
Sua missao é criar um programa que receba as informaçoes da coleira de Demasi e diga se em algum
momento Demasi esteve a uma distância maior do que a permitida.

Voce deve assumir que no instante 0 (zero) Demasi está dentro da delegacia (ou seja, a uma distância
zero).

1
Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha da entrada contém dois inteiros N e M (2 <= N <= 500.000, 1 <= M <= 1.000.000)
representando o número de registros enviados pela coleira de Demasi e a distância máxima que ele
pode ficar da delegacia, respectivamente. As N linhas seguintes contem os registros da coleira, em
ordem de envio. Cada linha contém um caractere C (’N’, ’S’, ’L’ ou ’O’, como especificados acima) e
um inteiro D (1 <= D <= 1.000) representando a distância percorrida no minuto.

Saída
Seu programa deve imprimir, na saída padrao, o valor 1 se em algum momento Demasi se afastou da
delegacia além da distância permitida, ou o valor 0 caso contrário.

Exemplos
Entrada
5 10
N 2
L 3
S 4
O 4
O 3

Saída
0

Entrada
5 10
N 6
L 8
S 15
O 5
O 4

Saída
1

Added by: Wanderley Guimarăes


Date: 2012-05-31
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 1 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11638. Maratona
Problem code: MARAT09
 

A maratona é talvez a prova mais desgastante entre as modalidades olímpicas: sao quarenta e dois mil,
cento e noventa e cinco metros de percurso. Por isso, os organizadores sempre posicionam vários
postos de água ao longo do trajeto da prova, onde copos de água sao distribuídos aos competidores.

Joao Saci é um jovem atleta que tem boas chances de se tornar um maratonista de primeira linha. No
entanto, Joao Saci descobriu que somente consegue terminar uma maratona se ingerir alguns copos de
água durante o percurso. O Laboratório de Biomecânica da universidade local, através de
experimentos, determinou que Joao Saci consegue percorrer exatamente mais dois mil metros após o
instante em que ingere um copo de água. A distância que Joao Saci consegue percorrer após ingerir um
copo de água é denominada de distância intermediária máxima. Assim, se a distância entre dois postos
de água consecutivos no percurso da maratona for sempre menor ou igual do que a distância
intermediária máxima de Joao Saci, ele consegue terminar a prova. Caso contrário ele nao consegue
terminar a prova.

O Laboratório de Biomecânica quer agora realizar estudos similares com outros maratonistas, que tem
valor de distâncias intermediárias máximas distintas, e precisa de sua ajuda.

Tarefa
Sua tarefa é escrever um programa que, dada a posiçao dos postos de água ao longo do percurso, e a
distância intermediária máxima de um atleta, determine se o atleta consegue ou nao completar a prova.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha da entrada contém dois números inteiros N e M, separados por um espaço em branco,
indicando respectivamente o número de postos de água (2 <= N <= 10000) e a distância intermediária
máxima de um atleta, em metros (1 <= M <= 42195). A segunda linha contém N números inteiros P i ,
separados por um espaço em branco, representando a posiçao dos postos de água ao longo do trajeto
da maratona. A posiçao de um posto de água é dada pela distância, em metros, do início do percurso
até o posto de água (0 <= P i <= 42195 para 1 <= i <= N). O primeiro posto de água está sempre
localizado no ponto de partida (ou seja, P 1 = 0) e todos os postos estao em posiçoes distintas. Além
disso, os postos de água sao dados na ordem crescente de sua distância ao início do percurso.

1
Note que a distância total da prova é a oficial para a maratona, ou seja, 42195 metros.

Saída
Seu programa deve imprimir, na saída padrao, uma única linha contendo o caractere ‘S’ se o atleta
consegue terminar a prova, ou o caractere ‘N’ caso contrário.

Exemplos
Entrada
3 20000
0 20000 33333

Saída
S

Entrada
8 6000
0 6000 12000 18000 24000 32000 37000 40000

Saída
N

Added by: Wanderley Guimarăes


Date: 2012-05-31
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 2 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11641. Caçadores de Mitos


Problem code: MITO09
 

Jorge é um apresentador de televisao que comanda a versao brasileira do grande sucesso Caçadores de
Mitos, onde se estuda um mito para descobrir se é fato ou apenas um boato.

No próximo episódio, Jorge deverá apresentar o mito que diz que "os raios nao caem duas vezes no
mesmo lugar", referindo-se aos raios das tempestades de chuva.

Para isso, foi até a cidade de Eletrolândia, que é a cidade com maior ocorrencia de raios no mundo. O
prefeito tem tanto orgulho desse título que mandou criar um sistema para registrar os raios. Jorge
conseguiu um relatório com as ocorrencias de cada raio que caiu na cidade nos últimos anos.

O mapa de Eletrolândia é um retângulo. Para o sistema de registro a cidade é subdividida em


quadrados de um metro de lado, denominados quadrantes. Assim, se a cidade tem 300 metros de
largura e 1000 de comprimento, ela será subdividida em 300.000 quadrantes. O sistema de registro
armazena o quadrante em que o raio caiu. Cada quadrante é identificado pelas suas coordenadas X e
Y, conforme ilustra a figura abaixo, que exemplifica um mapa de uma cidade com oito metros de
comprimento por cinco metros de largura (quarenta quadrantes).

Como os quadrantes sao relativamente pequenos, Jorge decidiu que se dois raios caíram no mesmo
quadrante, pode-se considerar que caíram no mesmo lugar.

Tarefa
Sua missao é escrever um programa que receba as coordenadas dos raios que caíram em Eletrolândia
nos últimos anos e determine se o mito estudado é realmente apenas um mito ou pode ser considerado
verdade.

1
Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha da entrada contém um número inteiro N (2 <= N <= 500.000) representando o
número de registros de raios no relatório. Cada uma das N linhas seguintes contém 2 números inteiros
X, Y (0 <= X, Y <= 500), representando o registro de um raio que caiu no quadrante cujas
coordenadas sao (X, Y).

Saída
Seu programa deve imprimir, na saída padrao, o número 0 se nenhum raio caiu no mesmo lugar, ou o
número 1 caso contrário. Note que voce deve imprimir o número 1 mesmo que haja mais do que 1 par
de raios que caíram no mesmo lugar.

Exemplos
Entrada
5
1 1
2 3
3 3
4 2
4 4

Saída
0

Entrada
8
1 1
2 2
2 3
4 4
2 3
6 5
9 11
10 10

Saída
1

Added by: Wanderley Guimarăes


Date: 2012-05-31
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 1 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11645. Notas da prova


Problem code: NOTA09
 

Rosy é uma talentosa professora do Ensino Médio que já ganhou muitos premios pela qualidade de sua
aula. Seu reconhecimento foi tamanho que foi convidada a dar aulas em uma escola da Inglaterra.
Mesmo falando bem ingles, Rosy ficou um pouco apreensiva com a responsabilidade, mas resolveu
aceitar a proposta e encará-la como um bom desafio.

Tudo ocorreu bem para Rosy até o dia da prova. Acostumada a dar notas de 0 (zero) a 100 (cem), ela
fez o mesmo na primeira prova dos alunos da Inglaterra. No entanto, os alunos acharam estranho, pois
na Inglaterra o sistema de notas é diferente: as notas devem ser dadas como conceitos de A a E. O
conceito A é o mais alto, enquanto o conceito E é o mais baixo.

Conversando com outros professores, ela recebeu a sugestao de utilizar a seguinte tabela, relacionando
as notas numéricas com as notas de conceitos:

O problema é que Rosy já deu as notas no sistema numérico, e terá que converter as notas para o
sistema de letras. Porém, Rosy precisa preparar as próximas aulas (para manter a qualidade que a
tornou reconhecida), e nao tem tempo suficiente para fazer a conversao das notas manualmente.

Tarefa
Voce deve escrever um programa que recebe uma nota no sistema numérico e determina o conceito
correspondente.

1
Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado). A entrada contém uma única linha com um número inteiro N (0 <= N <=
100), representando uma nota de prova no sistema numérico.

Saída
Seu programa deve imprimir, na saída padrao, uma letra (A, B, C, D, ou E em maiúsculas)
representando o conceito correspondente a nota dada na entrada.

Exemplos
Entrada
12

Saída
D

Entrada
87

Saída
A

Entrada
0

Saída
E

Added by: Wanderley Guimarăes


Date: 2012-06-03
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 1 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11646. Olimpíadas
Problem code: OLIMP09
 

O Comite Olímpico Internacional (COI) está visitando as cidades candidatas a sediar as Olimpíadas de
2016. O Rio de Janeiro é uma das cidades concorrentes, mas a competiçao é muito acirrada.

O COI tem um conjunto de exigencias que devem ser obedecidas pelas cidades candidatas, como boas
arenas para os jogos (ginásios, campos de futebol, pistas de atletismo, parque aquático,...), bons
alojamentos, um plano para o tráfego de veículos durante os jogos, etc. Durante sua visita ao Rio de
Janeiro, o COI colocou ainda mais uma exigencia: a demonstraçao da qualidade dos sistemas de
informática. Especificamente, o COI quer que a organizaçao local demonstre a sua capacidade em
informática produzindo um programa que gere a classificaçao final dos países, considerando o número
de medalhas recebidas pelos atletas de cada país.

Tarefa
Sua tarefa é escrever um programa que, dada a informaçao dos países que receberam medalhas de
ouro, prata e bronze em cada modalidade, gere a lista de classificaçao dos países na competiçao. Nesta
tarefa, os países serao identificados por números inteiros. O melhor colocado deve ser o país que
conseguiu o maior número de medalhas de ouro. Se houver empate entre países no número de
medalhas de ouro, o melhor colocado entre esses é o país que conseguiu o maior número de medalhas
de prata. Se houver empate também no número de medalhas de prata, o melhor colocado entre esses é
o país que recebeu o maior número de medalhas de bronze. Se ainda assim houver empate entre dois
países, o melhor classificado é o que tem o menor número de identificaçao.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha da entrada contém dois números inteiros N e M, separados por um espaço em branco,
indicando respectivamente o número de países (1 <= N <= 100) e número de modalidades esportivas
envolvidas na competiçao (1 <= M <= 100). Os países sao identificados por números inteiros de 1 a N.

Cada uma das M linhas seguintes contém tres números inteiros O, P e B, separados por um espaço em
branco, representando os países cujos atletas receberam respectivamente medalhas de ouro (1 <= O <=
N), prata (1 <= P <= N) e bronze (1 <= B <= N). Assim, se uma das M linhas contém os números 3 2
1, significa que nessa modalidade a medalha de ouro foi ganha pelo país 3, a de prata pelo país 2 e a de
bronze pelo país 1.

1
Saída
Seu programa deve imprimir, na saída padrao, uma linha contendo N números, separados por um
espaço em branco, representando os países na ordem decrescente de classificaçao (o primeiro número
representa o país que é o primeiro colocado, o segundo número representa o país que é o segundo
colocado, e assim por diante).

Exemplos
Entrada
2 2
2 1 2
1 2 2

Saída
2 1

Entrada
4 3
3 2 1
4 3 1
4 3 1

Saída
4 3 2 1

Entrada
3 3
3 1 2
2 3 1
1 2 3

Saída
1 2 3

Added by: Wanderley Guimarăes


Date: 2012-06-03
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 2 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11647. Overflow
Problem code: OVERF09
 

Os computadores foram inventados para realizar cálculos muito rapidamente, e atendem a esse
requisito de maneira extraordinária. Porém, nem toda conta pode ser feita num computador, pois ele
nao consegue representar todos os números dentro de sua memória. Em um computador pessoal atual,
por exemplo, o maior inteiro que é possível representar em sua memória é 4.294.967.295. Caso
alguma conta executada pelo computador de um resultado acima desse número, ocorrerá o que
chamamos de overflow, que é quando o computador faz uma conta e o resultado nao pode ser
representado, por ser maior do que o valor máximo permitido (em ingles overflow significa
trasbordar).

Por exemplo, se um computador só pode representar números menores do que 1023 e mandamos ele
executar a conta 1022 + 5, vai ocorrer overflow.

Tarefa
Dados o maior número que um computador consegue representar e uma expressao de soma ou
multiplicaçao entre dois inteiros, determine se ocorrerá overflow.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha da entrada contém um inteiro N (1 <= N <= 500.000) representando o maior número
que o computador consegue representar. A segunda linha contém um inteiro P (0 <= P <= 1000),
seguido de um espaço em branco, seguido de um caractere C (que pode ser ‘+’ ou ‘*’, representando
os operadores de adiçao e multiplicaçao, respectivamente), seguido de um espaço em branco, seguido
de um outro inteiro Q (0 <= Q <= 1000). Essa linha representa a expressao P + Q, se o caractere C for
‘+’, ou P × Q, se o caractere C for ‘*’.

Saída
Seu programa deve imprimir, na saída padrao, a palavra ‘OVERFLOW’ se o resultado da expressao
causar um overflow, ou a palavra ‘OK’ caso contrário. Ambas as palavras devem ser escritas com
letras maiúsculas.

1
Exemplos
Entrada
10
5 + 5

Saída
OK

Entrada
44
23 * 2

Saída
OVERFLOW

Entrada
323500
42 * 35

Saída
OK

Added by: Wanderley Guimarăes


Date: 2012-06-03
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 1 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11648. Avioes de papel


Problem code: PAPEL09
 

Para descontrair os alunos após as provas da OBI, a Diretora da escola organizou um campeonato de
avioes de papel. Cada aluno participante receberá uma certa quantidade de folhas de um papel especial
para fazer os seus modelos de avioes. A quantidade de folhas que cada aluno deverá receber ainda nao
foi determinada: ela será decidida pelos juízes do campeonato.

A diretora convidou, para atuarem como juízes, engenheiros da Embraer, uma das mais bem sucedidas
empresas brasileiras, que vende avioes com tecnologia brasileira no mundo todo. O campeonato está
programado para começar logo após a prova da OBI, mas os juízes ainda nao chegaram a escola. A
diretora está aflita, pois comprou uma boa quantidade de folhas de papel especial, mas nao sabe se a
quantidade comprada vai ser suficiente.

Considere, por exemplo, que a Diretora comprou 100 folhas de papel especial, e que há 33
competidores. Se os juízes decidirem que cada competidor tem direito a tres folhas de papel, a
quantidade comprada pela diretora é suficiente. Mas se os juízes decidirem que cada competidor tem
direito a quatro folhas, a quantidade comprada pela diretora nao seria suficiente.

Tarefa
Voce deve escrever um programa que, dados o número de competidores, o número de folhas de papel
especial compradas pela Diretora e o número de folhas que cada competidor deve receber, determine
se o número de folhas comprado pela Diretora é suficiente.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado). O arquivo de entrada contém tres números inteiros C (1 <= C <= 1000), P (1
<= P <= 1000) e F (1 <= F <= 1000) representando respectivamente o número de competidores, a
quantidade de folhas de papel especial compradas pela Diretora e a quantidade de folhas de papel
especial que cada competidor deve receber.

Saída
Seu programa deve imprimir, na saída padrao, o caractere ‘S’ se a quantidade de folhas compradas
pela Diretora é suficiente, ou o caractere ‘N’ caso contrário. Note que os caracteres devem ser letras
maiúsculas.

1
Exemplos
Entrada
10 100 10

Saída
S

Entrada
10 90 10

Saída
N

Entrada
5 40 2

Saída
S

Added by: Wanderley Guimarăes


Date: 2012-06-03
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 1 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11649. Caminho das pontes


Problem code: PONTES09
 

Pedrinho é um rapaz muito aventureiro, que nas férias viaja pelo mundo em busca de lugares afastados
e com bonitas vistas.

Na sua viagem atual, Pedrinho está andando por uma escura floresta quando se depara com um
perigoso desfiladeiro. Do outro lado do desfiladeiro ele sabe que existe um acampamento onde poderá
descansar durante a noite para continuar suas aventuras no dia seguinte.

Para chegar até o acampamento, ele terá que utilizar pontes que estao suspensas sobre o desfiladeiro.
As pontes foram construídas interligando altos pilares cravados no fundo do desfiladeiro.

O piso das pontes é feita de tábuas de tamanhos iguais. Mas as pontes sao velhas, e algumas tábuas
caíram. Felizmente, todas as tábuas que sobraram estao em perfeitas condiçoes, ou seja, nao existe o
perigo de Pedrinho pisar em uma delas e a tábua cair. Além disso, em nenhuma das pontes duas tábuas
consecutivas caíram, de forma que os buracos deixados pelas tábuas que caíram podem ser pulados
com segurança.

1
No local onde Pedrinho se encontra existe uma placa mostrando as ligaçoes entre as pontes e também
quantas tábuas estao faltando em cada uma das pontes. Pedrinho está cansado e nao há muita
visibilidade durante a noite. Ele precisa, portanto, tomar muito cuidado para nao cair em algum dos
buracos.

Pedrinho possui um laptop na mochila, mas só o usa para comunicar-se com os amigos. Ele liga sua
internet via satélite, encontra voce on-line, e pede sua ajuda.

Tarefa
Sua tarefa é escrever um programa que receba as informaçoes sobre as pontes (as ligaçoes entre elas e
a quantidade de tábuas faltando em cada uma) e calcule qual é o menor número de buracos que
Pedrinho precisa pular para chegar ao outro lado do desfiladeiro.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha da entrada contém dois números inteiros N e M (1 <= N <= 1.000, 2 <= M <=
10.000) representando o número de pilares no desfiladeiro e o número de pontes, respectivamente.
Cada uma das M linhas seguintes contém 3 inteiros S, T, B (0 <= S <= N + 1, 0 <= T <= N + 1 e 0 <=
B <= 1.000), indicando que existe uma ponte ligando os pilares S e T, e que possui B buracos. Nao
existe linha representando ponte com S = T. O valor de pilar 0 representa a borda do desfiladeiro onde
Pedrinho está, e o valor de pilar N + 1 representa a borda do desfiladeiro onde está o acampamento.
Nao existem duas pontes distintas ligando o mesmo par de locais (pilares ou bordas do desfiladeiro).

Voce pode supor que sempre existirá um caminho de pontes entre o lado do desfiladeiro em que
Pedrinho se encontra até o lado do desfiladeiro onde está o acampamento.

Saída
Seu programa deve imprimir, na saída padrao, um número inteiro representando a menor quantidade
de buracos que Pedrinho terá que pular para conseguir chegar ao acampamento.

Exemplos
Entrada
2 5
0 1 1
0 2 3
0 3 9
1 3 2
2 3 2

Saída
3

Entrada
4 9
0 1 1
0 3 4
0 4 2
1 2 5

2
1 5 3
2 5 5
3 4 2
3 5 5
4 5 8

Saída
4

Added by: Wanderley Guimarăes


Date: 2012-06-03
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 1 nível 2

3
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11650. Simulador
Problem code: SIMUL09
 

Um novo processador, denominado Faíska, está sendo desenvolvido para a empresa SBC. Este novo
processador tem apenas duas instruçoes: inversao e soma, descritas a seguir.

Inversao: dados dois endereços de memória X e Y , a operaçao inverte(X,Y) inverte a posiçao de


palavras da memória de forma que
a palavra no endereço X troca de posiçao com a palavra de memória da posiçao Y;
a palavra no endereço X + 1 troca de posiçao com a palavra de memória da posiçao Y - 1;
a palavra no endereço X + 2 troca de posiçao com a palavra de memória da posiçao Y - 2;
e assim por diante, até que X >= Y.
Soma: dados dois endereços de memória X e Y, a operaçao soma(X,Y) imprime a soma das
palavras de memória entre os endereços X e Y (inclusive).

Por exemplo, se a memória contém inicialmente, a partir da primeira posiçao de memória (endereço
igual a 1) os valores [1,2,3,4,5,6,7,8], a operaçao inverte(3,7) deixa a memória igual a [1,2,7,6,5,4,3,8].
Entao, nesse estado, a execuçao de soma(1,3) produz a saída 10.

Tarefa
Sua tarefa é escever um programa que, dada uma sequencia de instruçoes do Faíska, simule a execuçao
e produza o mesmo resultado que o Faíska produziria.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha da entrada contém dois números inteiros N e M, representando respectivamente o


número palavras na memória (1 <= N <= 10 9 ) e o número de instruçoes do programa (1 <= M <=
1000). Cada uma das M linhas seguintes contém uma instruçao do Faíska. Cada instruçao é composta
de um caratere descrevendo a instruçao (‘I’ para inversao e ‘S’ para soma), seguido de um espaço,
seguido de dois inteiros indicando os argumentos da instruçao.

Inicialmente a configuraçao da memória é tal que cada palavra tem como conteúdo o seu próprio
endereço. Em outras palavras, o conteúdo inicial da memória é [1,2,3,. . .,N]. Há pelo menos uma
instruçao soma em cada caso de teste.

1
Saída
Seu programa deve imprimir, na saída padrao, uma sequencia de números inteiros, um em cada linha,
indicando a saída gerada pelo Faíska.

Exemplos
Entrada
10 2
I 1 5
S 3 7

Saída
19

Entrada
15 4
S 2 11
I 10 15
I 1 10
S 5 10

Saída
65
21

Added by: Wanderley Guimarăes


Date: 2012-06-03
Time limit: 2s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11651. Banda
Problem code: BANDA09
 

Jimmy é um garoto muito esperto que adora música. No último mes ele ganhou um campeonato de um
jogo cujo objetivo é tocar guitarra. Empolgado, Jimmy decidiu montar uma banda. Para Jimmy a
banda perfeita tem quatro integrantes, ele e mais tres: um baterista, um baixista e um cantor.

Agora Jimmy precisa encontrar os outros integrantes da banda. Para isto ele reuniu todos os álbums
que encontrou na internet e, após escutá-los diversas vezes, compilou o que ele chama de lista de
entrosamento entre músicos. Nessa lista ele atribui, para cada par de músicos que já tocaram juntos,
uma nota inteira de 1 a 100, que é uma medida de quao bem os músicos tocam juntos (o nível de
entrosamento entre eles). Se dois músicos nunca tocaram juntos o nível de entrosamento é zero. Jimmy
nunca tocou com nenhum músico da lista.

Jimmy pretende formar a sua banda a partir da lista de entrosamento entre músicos, da seguinte
maneira: ele quer escolher os outros tres músicos de tal forma que a soma dos níveis de entrosamento
dos integrantes da banda seja a maior possível (ou seja, a soma dos níveis de entrosamento dos tres
pares possíveis de serem formados entre os tres novos integrantes seja a maior possível).

Mas a lista de entrosamento entre músicos ficou muito grande e Jimmy nao está conseguindo escolher
os integrantes. Por isso, Jimmy está pedindo sua ajuda.

Tarefa
Voce deve ajudar Jimmy a montar a melhor banda possível fazendo um programa que receba uma lista
contendo o nível de entrosamento para cada par de músicos que já tocaram junto, e determine os
músicos que formariam a melhor banda.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha da entrada é formada por dois inteiros N e M, informando respectivamente o número
de músicos (3 <= N <= 100) e o número de pares de músicos que já tocaram juntos (0 <= M <= 10 4 ).
Os músicos sao identificados por números inteiros de 1 a N. Cada uma das M linhas seguintes contém
tres inteiros X, Y e Z, em que X e Y representa um par de músicos (1 <= X <= N, 1 <= Y <= N e X !=
Y ) e Z representa o seu nível de entrosamento (1 <= Z <= 100). Cada par de músicos que já tocou
junto aparece uma única vez na entrada.

1
Saída
Seu programa deve imprimir, na saída padrao, uma única linha, contendo tres números inteiros
separados por espaço em branco, identificando os tres outros músicos que devem compor a banda (em
qualquer ordem). Se existir mais de uma melhor banda, Jimmy contenta-se com qualquer uma.

Exemplos
Entrada
3 3
1 2 50
2 3 27
3 1 1

Saída
1 2 3

Entrada
5 8
1 2 50
1 3 50
1 4 50
2 3 50
2 5 10
3 4 50
3 5 25
4 5 20

Saída
1 3 4

Added by: Wanderley Guimarăes


Date: 2012-06-03
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 2 nível 1 e 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11654. Cadeiras do auditório


Problem code: CADEIR09
 

As cadeiras do auditório da escola sao organizadas em um quadriculado com L linhas e C colunas. As


linhas sao numeradas de 1 a L, as colunas sao numeradas de 1 a C, e as cadeiras sao numeradas de 1 a
L × C, de tal modo que uma cadeira na linha i coluna j tem o número (i - 1) × C + j.

Durante a aula de teatro, a professora fez com que os alunos executassem uma sequencia de mudanças
na configuraçao da sala. Cada uma dessas mudanças intercambiou ou duas colunas ou duas linhas. A
figura abaixo ilustra uma configuraçao original com tres linhas e quatro colunas, a posiçao das
cadeiras após uma mudança (intercâmbio das colunas 1 e 4), e a posiçao das cadeiras após mais uma
mudança (intercâmbio das linhas 2 e 3).

Ao final da aula, como era de se esperar, a numeraçao das cadeiras ficou bem bagunçada. O problema
é que a próxima aula é de Matemática, e o professor é muito exigente, e quer começar a aula com as
cadeiras perfeitamente posicionadas da maneira original.

Tarefa
Sua tarefa é escrever um programa que, dada a posiçao de cada cadeira ao final da aula de teatro,
determine qual é a menor sequencia de mudanças que devem ser executadas para retornar as cadeiras
aos seus devidos lugares, considerando que cada mudança faça o intercâmbio ou de duas linhas ou de
duas colunas de cadeiras.

1
Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha da entrada contém dois números inteiros L e C, representando respectivamente o


número de linhas e o número de colunas de cadeiras do auditório (1 <= L <= 200 e 1 <= C <= 200).
Cada uma das L linhas seguintes contém C números inteiros entre 1 e L × C, separados por um espaço
em branco, indicando a posiçao das cadeiras ao final da aula de teatro. O j-ésimo número dado na linha
i é o número da cadeira que se encontra na linha i e coluna j.

Saída
Seu programa deve imprimir, na saída padrao, na primeira linha um inteiro K representando o número
de mudanças necessárias para retornar as cadeiras para sua posiçao original. Cada uma das K linhas
seguintes contém a descriçao de uma mudança, na forma de um caractere M (que pode ser ‘L’ ou ‘C’),
seguido de um espaço em branco, seguido de um inteiro X, seguido de um espaço em branco, seguido
de um inteiro Y. Se o caractere descrevendo a mudança é ‘L’, X e Y representam linhas que devem ser
intercambiadas; se o caractere descrevendo a mudança é ‘C’, X e Y representam colunas que devem
ser intercambiadas.

Para todos os casos testes existe soluçao com K <= 1000. Se mais de uma soluçao existe com o mesmo
número de mudanças, imprima qualquer uma delas.

Exemplos
Entrada
2 2
4 3
2 1

Saída
2
L 1 2
C 1 2

Entrada
3 4
1 2 3 4
5 6 7 8
9 10 11 12

Saída
0

Added by: Wanderley Guimarăes


Date: 2012-06-03
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

11675. Olimpíadas
Problem code: OLIMPJ09
 

O Comite Olímpico Internacional (COI) está visitando as cidades candidatas a sediar as Olimpíadas de
2016. O Rio de Janeiro é uma das cidades concorrentes, mas a competiçao é muito acirrada.

O COI tem um conjunto de exigencias que devem ser obedecidas pelas cidades candidatas, como boas
arenas para os jogos (ginásios, campos de futebol, pistas de atletismo, parque aquático,...), bons
alojamentos, um plano para o tráfego de veículos durante os jogos, etc. Durante sua visita ao Rio de
Janeiro, o COI colocou ainda mais uma exigencia: a demonstraçao da qualidade dos sistemas de
informática. Especificamente, o COI quer que a organizaçao local demonstre a sua capacidade em
informática produzindo um programa que gere a classificaçao final dos países, considerando o número
total de medalhas recebidas pelos atletas de cada país.

Tarefa
Sua tarefa é escrever um programa que, dada a informaçao dos países que receberam medalhas de
ouro, prata e bronze em cada modalidade, gere a lista de classificaçao dos países na competiçao. Nesta
tarefa, os países serao identificados por números inteiros. O melhor colocado deve ser o país que
conseguiu o maior número de medalhas, independentemente do tipo da medalha (ouro, prata ou
bronze). Se houver empate entre dois países no número total de medalhas, o melhor classificado é o
país que tem o menor núumero de identificaçao.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado).

A primeira linha da entrada contém dois números inteiros N e M, separados por um espaço em branco,
indicando respectivamente o número de países (1 <= N <= 100) e número de modalidades esportivas
envolvidas na competiçao (1 <= M <= 100). Os países sao identificados por números inteiros de 1 a N.

Cada uma das M linhas seguintes contém tres números inteiros O, P e B, separados por um espaço em
branco, representando os países cujos atletas receberam respectivamente medalhas de ouro (1 <= O <=
N), prata (1 <= P <= N) e bronze (1 <= B <= N). Assim, se uma das M linhas contém os números 3 2
1, significa que nessa modalidade a medalha de ouro foi ganha pelo país 3, a de prata pelo país 2 e a de
bronze pelo país 1.

1
Saída
Seu programa deve imprimir, na saída padrao, uma linha contendo N números, separados por um
espaço em branco, representando os países na ordem decrescente de classificaçao (o primeiro número
representa o país que é o primeiro colocado, o segundo número representa o país que é o segundo
colocado, e assim por diante).

Exemplos
Entrada
2 2
2 1 2
1 2 2

Saída
2 1

Entrada
4 3
3 2 1
4 3 1
4 3 1

Saída
1 3 4 2

Entrada
3 3
3 1 2
2 3 1
1 2 3

Saída
1 2 3

Added by: Wanderley Guimarăes


Date: 2012-06-03
Time limit: 1s
Source limit:50000B
Languages: All except: AWK CLOJ ERL F# GO JS PERL 6 SCALA SED TCL
Resource: OBI 2009 - fase 2 nível júnior

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

12928. Labirinto
Problem code: LAB07
Um amigo seu está muito empolgado com um novo joguinho que baixou em seu celular. O jogo
consiste em uma espécie de labirinto que pode ser representado por um quadriculado de células
quadradas com N linhas e M colunas. Cada célula do labirinto contém uma plataforma que está a uma
determinada altura do chao, que pode ser representada por um inteiro a que varia de 0 (a mais baixa) a
9 (a mais alta). Voce inicia na célula (1, 1) (canto superior esquerdo) e o objetivo é chegar na saída do
labirinto que fica na célula (N, M) (canto inferior direito).

Para sair do labirinto, voce deve fazer movimentos entre células adjacentes. O problema é que seu
bonequinho nao consegue pular muito alto, entao se a célula destino estiver duas ou mais unidades
acima da sua altura atual, voce nao consegue move-lo. Mais especificamente, a cada turno voce pode
mover para uma das 4 células adjacentes (cima, baixo, direita, esquerda) caso a altura da célula destino
seja menor ou igual a altura da sua célula atual mais uma unidade. Ou seja, se a altura da sua célula for
A, voce só pode mover a uma célula adjacente caso a altura dela seja menor ou igual a A + 1.

Para complicar um pouco mais o jogo, a cada turno, após o jogador realizar sua açao, cada célula
aumenta em uma unidade sua altura, até o valor máximo de 9. Caso a altura de uma determinada célula
seja 9, ela passa a ser 0. Note que, em um dado turno, o jogador nao é obrigado a se mover, ele pode
simplesmente esperar as plataformas subirem ou descerem. Além disso, repare que nem todas as
células tem 4 vizinhos, uma vez que nao é permitido ao jogador se mover para fora dos limites do
labirinto.

Voce, como bom programador que é, resolve escrever um programa que calcule a menor quantidade
de turnos possível para chegar a saída de um dado labirinto.

Tarefa
Escreva um programa que, dado um labirinto, retorne a menor quantidade de turnos necessária para
chegar a saída, de acordo com as restriçoes dadas.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado). A primeira linha da entrada contém dois inteiros N e M (2 <= N, M <= 50)
separados por um espaço em branco, que representam, respectivamente, a quantidade de linhas e
colunas do labirinto. As N linhas seguintes contem, cada uma, M inteiros que representam a altura
inicial (no turno 0) da respectiva plataforma. As alturas estao sempre entre 0 e 9 (inclusive).

1
Saída
Seu programa deve imprimir, na saída padrao, uma única linha, contendo a menor quantidade de
turnos possível para sair do labirinto.

Exemplos
Entrada:
4 3
0 0 0
0 0 0
0 0 0
0 0 0

Saída:
5

Entrada:
3 3
1 2 3
4 5 6
7 8 9

Saída:
12

Entrada:
3 5
1 3 1 1 1
1 3 1 3 1
1 1 1 3 1

Saída:
10

Added by: Wanderley Guimarăes


Date: 2012-12-06
Time limit: 1s
Source
50000B
limit:
Cluster: Cube (Intel Pentium G860 3GHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: OBI 2007 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

12930. Pizza
Problem code: PIZZA07
Rodrigo pediu uma pizza de mussarela de N fatias, uma parte somente com cebola e o resto somente
com azeitonas. Entretanto, ao receber a pizza em casa, notou que o motoqueiro que a entregou nao foi
cuidadoso o suficiente, pois tanto as tiras de cebola quanto as azeitonas estavam espalhadas por toda a
pizza. Para piorar, como a pizza era de mussarela, as tiras de cebola e as azeitonas estavam grudadas
na pizza.

Como gosta mais de cebola do que de azeitona, Rodrigo deseja pegar fatias consecutivas da pizza de
tal forma que estas contenham a maior diferença possível entre tiras de cebola e azeitonas. Para isso,
ele contou quantas tiras e quantas azeitonas tinham em cada fatia e subtraiu os dois valores, nessa
ordem. Assim, sempre que uma fatia contiver mais cebolas que azeitonas, ela recebe um número
positivo, e caso contrário, um número negativo. Uma fatia cujo número seja zero contém o mesmo
número de tiras de cebolas e azeitonas.

Por exemplo, supondo que as fatias contenham as seguintes diferenças: 5, -3, -3, 2, -1, 3, pode-se
pegar uma fatia consecutiva com 9 cebolas a mais que azeitonas, utilizando as fatias com as diferenças
2, -1, 3, 5 (lembre-se de que estamos tratando de um círculo e, portanto, a fatia com diferença 5 é
vizinha da fatia com diferença 3 e vice-versa).

Como Rodrigo nao entende de programaçao, ele resolveu contar com seus serviços.

OBS: repare que é melhor nao escolher nenhuma fatia caso somente seja possível escolher fatias
consecutivas com mais azeitonas que cebolas.

Tarefa
Escreva um programa que, dados as diferenças entre as quantidades de cebolas e azeitonas em cada
fatia de pizza, retorne a maior quantidade possível de cebolas que Rodrigo pode comer a mais do que a
quantidade de azeitonas utilizando somente fatias consecutivas de pizza. (lembrando que a primeira
fatia é adjacente a última e vice-versa).

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado). A primeira linha da entrada contém um inteiro N que indica o número de
fatias de pizza (1 <= N <= 100.000). A segunda linha contém N inteiros K (-100 <= K <= 100)
separados por um espaço em branco com as diferenças entre as quantidades de cebolas e de azeitonas.

1
Saída
Seu programa deve imprimir, na saída padrao, uma única linha, contendo a maior quantidade de
cebolas que Rodrigo pode comer a mais do que azeitonas.

Exemplos
Entrada:
6
5 -3 -3 2 -1 3

Saída:
9

Entrada:
7
1 -2 2 -1 4 1 -5

Saída:
6

Entrada:
2
-3 -10

Saída:
0

Added by: Wanderley Guimarăes


Date: 2012-12-06
Time limit: 1s
Source
50000B
limit:
Cluster: Cube (Intel Pentium G860 3GHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: OBI 2007 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

12937. Penalidade mínima


Problem code: PENAL06
A Sra. Bastos é uma elaboradora de passatempos matemáticos e pediu para que voce criasse um
programa que conseguisse jogar de forma eficiente a sua mais nova criaçao.

O jogo consiste em um tabuleiro formado por casas dispostas em N linhas por N colunas. Cada casa
contém um inteiro nao-negativo. No começo do jogo, uma peça é colocada na casa localizada no canto
superior esquerdo, ou seja, na posiçao (1,1). O objetivo do jogo é mover a peça até a casa localizada
no canto inferior direito (posiçao (N,N)) somente movendo um único quadrado para baixo ou para a
direita em cada passo. Além disso, a peça nao pode ser colocada em nenhum quadrado que contenha o
número zero.

O custo do caminho utilizado para percorrer o tabuleiro corresponde ao produto de todos os números
das casas percorridos no caminho. A penalidade é definida utilizando a representaçao decimal do
custo, sendo representada pelo número de dígitos zeros, contados da direita para a esquerda, antes do
primeiro dígito diferente de zero. Por exemplo, um custo igual a 501000 tem penalidade 3, e um custo
igual a 501 tem penalidade zero.

O objetivo do jogo é conseguir chegar a casa (N,N) através de um caminho "otimizado". Dizemos que
o caminho foi otimizado se a penalidade for mínima.

Tarefa
Escreva um programa que, dado um tabuleiro, determine a penalidade do custo otimizado.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado). A primeira linha da entrada contém um inteiro N que indica o número de
linhas e colunas do tabuleiro (1 <= N <= 1000). As N linhas seguintes contem N inteiros I cada (1 <= I
<= 1000000), que representam o valor da casa do tabuleiro naquela posiçao. Existe pelo menos uma
soluçao possível para todos os casos de teste.

Saída
Seu programa deve imprimir, na saída padrao, uma única linha, contendo a penalidade do custo
"otimizado".

1
Exemplos
Entrada:
3
1 2 3
4 5 6
7 8 9

Saída:
0

Entrada:
3
5 7 6
4 0 1
3 2 5

Saída:
1

Entrada:
4
1 3 0 0
0 8 2 25
6 5 0 3
0 15 7 4

Saída:
2

Added by: Wanderley Guimarăes


Date: 2012-12-07
Time limit: 1s
Source
50000B
limit:
Cluster: Cube (Intel Pentium G860 3GHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: OBI 2006 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

12939. Păo a metro


Problem code: PAO07
Pao a metro é um tipo de sanduíche gigante que é uma excelente opçao de lanche para torneios de
programaçao, embora a experiencia já tenha mostrado que o oferecimento de sanduiches pode gerar
reclamaçao dos competidores. Outro grande problema é que algumas pessoas sao mais gulosas que
outras e, dessa maneira, acabam pegando pedaços maiores que os pedaços dos outros. Para a final da
OBI, a coordenaçao estava pensando em providenciar pao a metro para os competidores, porém tais
problemas os fizeram recuar na idéia.

Embora a idéia tenha sido momentaneamente abandonada, uma idéia simples surgiu: cortar
previamente o pao em fatias de tamanho iguais e distribuí-las entre as pessoas. O único problema com
tal idéia é que se o número de pessoas for muito grande, fica impraticável ter apenas um pao. Por
exemplo, se quisermos que 1.000 pessoas recebam 20 centímetros de sanduíche, seria necessário um
sanduíche de 20.000 centímetros, ou 200 metros!

Alguém levantou a seguinte hipótese: se houvessem N pessoas e fossem encomendados K sanduíches


de empresas diferentes, cada qual com uma determinada metragem (tamanho) Mi (1 <= i <= K), seria
possível retirar desses paes N fatias de mesmo tamanho, possivelmente sobrando partes nao utilizadas.
A questao seria: qual o tamanho inteiro máximo que essas fatias poderao ter?

Por exemplo, se tivermos K = 4, com os tamanhos (em centímetros) M1 = 120, M2 = 89, M3 = 230 e
M4 = 177 e N = 10, podemos retirar N fatias iguais de tamanho máximo 57, pois assim conseguimos 2
fatias no primeiro pao, 1 no segundo, 4 no terceiro e 3 no quarto, totalizando as 10 fatias necessárias.
Se tentarmos cortar fatias de tamanho 58, só será possível obter 3 fatias do terceiro pao, totalizando 9
e, portanto, 57 é realmente o melhor que podemos obter. Note que nao podemos usar duas ou mais
fatias menores de diferentes paes para formarmos uma fatia do tamanho selecionado. (ficaria muito
deselegante dar um lanche recortado ‘as pessoas).

Tarefa
Escreva um programa que, dados os tamanhos de pao disponíveis (em centímetros) e a quantidade de
pessoas a serem atendidas, retorne o tamanho inteiro máximo (em centímetros) da fatia que pode ser
cortada de maneira a atender todas as pessoas.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado). A primeira linha da entrada contém um inteiro N que indica a quantidade
pessoas (1 <= N <= 10.000). A segunda linha contém um inteiro K (1 <= K <= 10.000) que é a
quantidade de sanduíches disponível. Na terceira linha há K inteiros M (1 <= M <= 10.000) separados
por um espaço em branco representando o tamanho de cada pao.

1
Saída
Seu programa deve imprimir, na saída padrao, uma única linha, contendo o tamanho inteiro máximo
da fatia que pode ser cortada.

Exemplos
Entrada:
10
4
120 89 230 177

Saída:
57

Entrada:
3
2
45 85

Saída:
42

Entrada:
7
7
100 98 99 505 102 97 101
Saída:
101

Added by: Wanderley Guimarăes


Date: 2012-12-07
Time limit: 0.050s
Source
50000B
limit:
Cluster: Cube (Intel Pentium G860 3GHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: OBI 2007 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

12993. Auto Estrada


Problem code: AUTO08
Certas regioes resolveram o problema de tráfego intenso com a construçao de auto estradas, que sao
estradas contendo em geral quatro ou mais pistas de rolagem em cada sentido, de forma que um
número grande de carros possa passar sem que ocorram congestionamentos. O problema das auto
estradas é que, junto com os carros temos um aumento considerável de ruído nas imediaçoes da pista,
o que incomoda os moradores das regioes próximas.

A GoTo engenharia, uma empresa do ramo de construçao especializada em obras de estradas,


encontrou uma soluçao engenhosa para o problema: instalar grandes painéis defletores de som de cada
lado da auto estrada para tentar minimizar o ruído percebido pelos vizinhos.

Os painéis sao construídos em blocos contínuos de 10 metros lineares. A auto estrada também é
dividida em blocos de 10 metros de extensao, sendo cada bloco descrito por um código, como definido
abaixo:

* P - Pista, trecho em linha reta sem curvas ou saídas. Deve-se instalar um painel de cada lado da auto
estrada.

* C - Curva, trecho em curva de 90 graus na auto estrada. Deve-se instalar dois painéis de concreto do
lado externo da curva; o outro lado fica sem painel instalado.

* A - Acesso, trecho em linha reta no qual existe uma entrada ou uma saída a partir de um dos lados da
auto estrada (mas nao do outro). Deve-se instalar um painel no lado onde nao existe o acesso.

* D - Duplo acesso, trecho em linha reta no qual existem dois acessos (entradas ou saídas, em qualquer
combinaçao possível), um de cada lado da rodovia. Nenhum painel deve ser instalado nesse bloco da
auto estrada.

Apesar de ser uma empresa formada por engenheiros, nenhum dos funcionários da GoTo sabe
programar, de forma que eles decidiram contrataram voce como consultor independente. Voce deve
escrever um programa para, dado um mapa da auto estrada, determinar quantos painéis defletores sao
necessários para cobrir toda a extensao dessa auto estrada.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado). A primeira linha contém um inteiro C (1 <= C <= 10 6 ), indicando o
comprimento da auto estrada, em blocos de 10 metros. A linha seguinte contem C caracteres, cada
letra descrevendo um bloco de 10 metros da auto estrada, como definido acima.

1
Saída
Seu programa deve imprimir, na saída padrao, uma única linha contendo um número inteiro,
representando quantas unidades de painel sao necessárias para cobrir toda a extensao da auto estrada.

Exemplos
Entrada:
5
DAPCD

Saída:
5

Entrada:
8
AACCAAPP

Saída:
12

Entrada:
14
ADCCPPPPPAADCP

Saída:
21

Added by: Wanderley Guimarăes


Date: 2012-12-14
Time limit: 1s
Source
50000B
limit:
Cluster: Cube (Intel Pentium G860 3GHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: OBI 2008 - fase 2 nível 1, 2 e Jr.

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

12994. Viagem Espacial


Problem code: VIAESP08
A empresa de jogos Sonyc está desenvolvendo um novo jogo de naves espaciais, chamado Space
Traveller (Viajante Espacial). O objetivo do jogo é viajar entre dois pontos sem colidir com nenhum
asteróide no caminho.

Para o protótipo, voce foi contratado para implementar o programa responsável por verificar se um tiro
disparado pela nave atingiu um determinado asteróide. Nessa primeira versao, os tiros disparados pela
nave sao projeçoes num plano 2D, formando uma linha reta infinita, e asteróides sao circunferencias
perfeitas. Para que um tiro efetivamente destrua qualquer asteróide, ele deve tangenciar a
circunferencia que define o asteróide.

Dada uma sequencia de tiros realizados pela nave e a localizaçao de um asteróide, voce deve dizer
quantos tiros acertaram o asteróide.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado). A primeira linha da entrada contém quatro números inteiros N, X C , Y C e R
(1 <= N <= 1.000, 0 <= X C <= 1.000, 0 <= Y C <= 1.000, 1 <= R <= 1.000) indicando,
respectivamente, o número de tiros, as duas coordenadas no plano do centro do asteróide (X C , Y C ), e
o raio do asteróide.

Em seguida haverá N linhas, uma para cada tiro. Cada linha terá 4 inteiros X 1 , Y 1 , X 2 , Y 2 (0 <= X 1 ,
X 2 , Y 1 , Y 2 <= 1.000), representando duas coordenadas de pontos distintos da reta formada pela
projeçao do tiro.

Saída
Seu programa deve imprimir, na saída padrao, uma única linha, contendo um inteiro, indicando
quantos tiros atigiram o asteróide.

Exemplos
Entrada:
2 10 10 5
10 1 10 3
4 11 4 10

Saída:
1

1
Entrada:
2 5 5 1
0 0 0 1
0 0 1 0

Saída:
0

Entrada:
3 6 4 2
1 4 2 4
1 5 6 4
0 0 6 1

Saída:
2

Added by: Wanderley Guimarăes


Date: 2012-12-14
Time limit: 1s
Source
50000B
limit:
Cluster: Cube (Intel Pentium G860 3GHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: OBI 2008 - fase 2 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

12995. Cavalos
Problem code: CAVALO08
O jogo de xadrez como conhecido hoje foi inventado por volta do século XV, na Europa Medieval.
Uma das suas peças mais interessantes é o cavalo, que se movimenta e ataca outras peças conforme a
figura abaixo:

Na figura, o símbolo ‘*’ representa as posiçoes que o cavalo na casa central ataca.

Existem vários quebra-cabeças interessantes envolvendo os movimentos do cavalo; um deles pergunta


quantos cavalos podem ser colocados em um tabuleiro M × N de forma que nenhum par de cavalos se
ataque:

A sua tarefa é escrever um programa que, dados M e N, determina quantos cavalos podem ser
colocados em um tabuleiro M × N de forma que nenhum par de cavalos ataque-se simultaneamente.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado). A primeira (e única) linha da entrada contém dois inteiros, M e N, (1 <= M
<= 1000, 1 <= N <= 1000) indicando, respectivamente, o número de linhas e o número de colunas do
tabuleiro.

1
Saída
Seu programa deve imprimir, na saída padrao, uma única linha, contendo um inteiro indicando o maior
número de cavalos que podem ser colocados no tabuleiro sem que dois deles se ataquem.

Exemplos
Entrada:
5 3

Saída:
8

Entrada:
2 6

Saída:
8

Entrada:
1 4

Saída:
4

Added by: Wanderley Guimarăes


Date: 2012-12-14
Time limit: 1s
Source
50000B
limit:
Cluster: Cube (Intel Pentium G860 3GHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: OBI 2008 - fase 2 nível 1

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

12997. Chuva
Problem code: CHUVA08
A robótica causou uma grande revoluçao nos processos industriais no mundo todo; atualmente, vários
tipos de robôs sao usados na fabricaçao de carros, equipamentos eletrônicos e até mesmo utensílios
domésticos.

Uma fábrica possui um robô de manutençao, que constantemente precisa ser deslocado entre setores
diferentes para executar vários serviços. A movimentaçao do robô é feita por controle remoto: ele pode
andar qualquer distância, mas apenas nas quatro direçoes cardeais (norte, sul, leste e oeste).

Robôs sao feitos de metal, e por isso é ideal que eles evitem contato direto com a água. Assim, em dias
chuvosos, é ideal que a trajetória do robô passe por dentro de galpoes, debaixo de marquises e toldos,
etc. para evitar sua exposiçao a chuva.

A sua tarefa é escrever um programa que, dadas as informaçoes sobre as áreas cobertas e ponto inicial
e final do robô, determine uma trajetória para o robô que minimize a porçao do trajeto feita sob chuva.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado). A primeira linha da entrada contém quatro inteiros X i , Y i , X f e Y f (0 <=
X i , Y i , X f , Y f <= 10 6 ), indicando, respectivamente, a posiçao atual e a posiçao final do robô -- o
robô começa na posiçao (X i , Y i ) e deve terminar na posiçao (X f , Y f ).

A linha seguinte da entrada contém um único inteiro N (0 <= N <= 1000), indicando o número de
áreas cobertas na fábrica. Cada uma das N linhas seguintes contém quatro inteiros X 1 , Y 1 , X 2 e Y 2
(0 <= X 1 < X 2 <= 10 6 , 0 <= Y 1 < Y 2 <= 10 6 ), indicando uma regiao coberta.

Uma regiao coberta é um retângulo de lados paralelos aos eixos tal que (X 1 , Y 1 ) e (X 2 , Y 2 ) sao
vértices opostos do retângulo. Duas áreas cobertas podem ter regioes comuns. O robô pode entrar e
sair de uma área coberta por qualquer ponto de seu perímetro, e pode trafegar livremente dentro da
área coberta.

Saída
Seu programa deve imprimir, na saída padrao, uma única linha, contendo um número inteiro indicando
a menor distância que o robô precisa percorrer sob chuva.

1
Exemplos
Entrada:
0 0 4 3
0

Saída:
7

Entrada:
2 5 5 0
1
0 0 1 5

Saída:
5

Entrada:
4 5 5 0
2
0 0 1 5
0 0 3 2

Saída:
5

Added by: Wanderley Guimarăes


Date: 2012-12-14
Time limit: 1s
Source
50000B
limit:
Cluster: Cube (Intel Pentium G860 3GHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: OBI 2008 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

12998. Ortografia
Problem code: ORTOG08
Um serviço de busca na Internet está preocupado com a crescente taxa de erros de ortografia de seus
usuários, tornando mais difíceis as buscas por palavras chaves, que constantemente contem erros de
algumas letras, devidos a má digitaçao ou má ortografia.

O serviço funciona com base num dicionário de palavras. O usuário deve inserir uma palavra num
campo de um formulário; o serviço entao procura esta palavra no dicionário e retorna conteúdo que
tenha relaçao com a palavra.

Para contornar o problema de ortografia, voce foi contratado para fazer um programa que tenta
adivinhar qual palavra o usuário pretendia procurar, independente de haver erros de ortografia nela.

Para este problema vamos definir a distância entre duas palavras A e B como sendo o número de
operaçoes, descritas abaixo, necessárias para transformar A em B:

1. Retirar uma letra de A.


2. Adicionar uma letra a A, em qualquer posiçao.
3. Trocar qualquer letra de A por outra letra, na mesma posiçao.

O serviço de busca definiu que a palavra P fornecida pelo usuário pode se referir a uma palavra D do
dicionário se está a uma distância de no máximo 2 de D.

Exemplos:

A palavra ‘tu’ pode se referir a palavra do dicionário ‘tubo’, realizando duas vezes a operaçao 2.
A palavra ‘crto’ pode se referir a palavra do dicionário ‘corte’, realizando uma vez a operaçao 2 e
uma vez a operaçao 3.
A palavra ‘crto’ pode se referir a palavra do dicionário ‘curto’, realizando uma vez a operaçao 2.
A palavra ‘hortgrafea’ nao pode se referir a palavra do dicionário ‘ortografia’.

Voce deve escrever um programa que, dado um dicionário de palavras, descubra para cada palavra
fornecida pelo usuário a quais palavras do dicionário ela pode se referir, nas condiçoes descritas
acima.

Entrada
A entrada contém um único conjunto de testes, que deve ser lido do dispositivo de entrada padrao
(normalmente o teclado). A primeira linha contém 2 inteiros N, M, representando respectivamente o
número de palavras contidas no dicionário (1 <= N <= 1000) e o número de palavras a serem
analisadas (1 <= M <= 100). Cada uma das N linhas seguintes conteré uma palavra pertencente ao

1
dicionário. Cada uma das M linhas seguintes conterá uma palavra a ser analisada, fornecida pelo
usuário. Cada palavra pode ter de 1 a 20 letras, contendo apenas letras de ‘a’ a ‘z’, minúsculas.

Saída
Seu programa deve imprimir, na saída padrao, M linhas, sendo uma linha para cada palavra fornecido
pelo usuário. Cada linha deve conter todas palavras do dicionário as quais a palavra fornecida pode se
referir. No caso de haver mais de uma palavra em uma linha da resposta, elas devem ser separadas por
um espaço em branco, aparecendo na ordem que elas foram dadas na entrada, como pode ser visto no
exemplo de saída abaixo. No caso de nao haver nenhuma palavra em uma linha da resposta, deixe-a
em branco.

Exemplo
Entrada:
3 3
pato
pateta
caneca
pat
ccanecos
pata

Saída:
pato

pato pateta

Added by: Wanderley Guimarăes


Date: 2012-12-14
Time limit: 1s
Source
50000B
limit:
Cluster: Cube (Intel Pentium G860 3GHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: OBI 2008 - fase 2 nível 2

2
(function() { var po = document.createElement(’script’); po.type = ’text/javascript’; po.async = true;
po.src = ’https://apis.google.com/js/plusone.js’; var s =
document.getElementsByTagName(’script’)[0]; s.parentNode.insertBefore(po, s); })();

SPOJ Problem Set (obi)

12999. Frete da Família Silva


Problem code: FRETE08
Houve uma determinada época no planeta Terra em que a populaçao estava grande demais, e
determinadas medidas foram tomadas para sanar esse problema. Uma vez que as primeiras colônias já
haviam se estabelecido no planeta Marte, todos os países concordaram em mandar para lá algumas
pessoas. O presidente de Pizzalândia, Lagosta da Silva, era uma pessoa que valorizava a família, e
decidiu que nao ia separar famílias em nome dessa atitude. Resolveu, entao, mandar uma família
inteira para Marte. No caso, a dele mesmo, a família Silva, provavelmente a mais numerosa do
planeta.

Tal família estabeleceu-se em Marte sem problemas, ainda mais com novas invençoes que havia por
lá. Uma delas era a pílula de nanicolina, substância descoberta naquele planeta, próximo a uma regiao
onde existem pedras voadoras, pedras macias e até pedras falantes. Lendas dizem que algum outro ser
extra-terrestre depositou a nanicolina ali num passado distante, enquanto visitava o planeta. O efeito da
pílula de nanicolina é a diminuiçao de tamanho de quem a toma, por um determinado tempo. Tal pílula
foi, entao, produzida em escala industrial e hoje em dia é distribuída pelos governos marcianos aos
colonos que lá residem.

A família Silva, todos os anos, encontra-se em alguma das muitas colônias em Marte para celebrar o
aniversário da chegada deles ao planeta. O chefe da família é quem sempre paga o transporte de todos.
O transporte é feito através de ônibus-flutuadores fretados. Como todos podem tomar pílulas da
nanicolina e ficarem minúsculos, podemos dizer que dentro de cada ônibus-flutuador cabem infinitas
pessoas, e que o efeito da pílula vai durar durante toda a viagem.

Assim, o preço de uma viagem de ônibus-flutuador entre duas colônias nao depende do número de
pessoas que viajam, sendo um preço fixo. Isso permite que algumas economias sejam feitas. Suponha
que existam quatro colônias dos Silvas em Marte, ilustrados abaixo:

1
Os círculos representam as colônias, e as conexoes entre elas representam as estradas existentes. O
número nas conexoes representa o preço de uma viagem de ônibus-flutuador em qualquer direçao. Ou
seja, uma viagem da colônia A direto para a colônia C (ou de C para A), custa 5 moedas de silício, nao
importa o número de passageiros.

Suponha que o grande encontro seja na colônia A. Se o chefe da família pagar o frete de B para A, de
C para A e de D para A, vai acabar gastando 25 moedas.

Mas uma coisa que poderia ser feita, também, é: os Silvas das colônias B e D vao para a C. Da C,
todos vao para a colônia A. Isso tudo teria um gasto de somente 10 moedas.

Este ano o número de colônias dos Silvas aumentou muito em Marte, e o chefe da família está muito
preocupado com o dinheiro que vai gastar para pagar todas as viagens. Entao ele contratou voce, que é
o melhor programador daquele planeta, a fazer um programa que recebe as informaçoes a respeito das
colônias, das estradas e dos fretes de ônibus-flutuadores, e determine qual é a menor quantidade de
dinheiro necessária para custear o transporte de todos os Silvas para o encontro. O desespero do chefe
da família é tanto que ele nao se importa em qual colônia será o encontro, desde que os custos sejam
minimizados.

Voce pode assumir que:

Entre duas colônias diferentes existe no máximo uma estrada direta.


Sempre existe um caminho (de uma ou mais estradas) entre quaisquer duas colônias.

Entrada
A entrada contém um único teste, a ser lido da entrada padrao. A primeira linha contém dois inteiros:
N e M (2 <= N <= 1000, 1 <= M <= 10.000), que representam, respectivamente, o número de colônias
e o número de estradas existentes. Depois, seguem M linhas com 3 inteiros: P, Q e U (0 <= P, Q <= N
- 1, 1 <= U <= 1000), indicando que existe uma estrada de mao dupla entre as colônias P e Q, cujo
custo do frete de viagem entre essas duas colônias é U moedas.

Saída
Seu programa deve imprimir, na saída padrao, um único inteiro, representando o número mínimo de
moedas necessárias para custear o transporte de todos os Silvas a colônia onde será realizada o
encontro.

Exemplos
Entradas:
4 6
0 1 10
0 2 5
0 3 10
1 2 3
1 3 4
2 3 2

Saída:
10

2
Entradas:
4 6
0 1 1
0 2 1
0 3 1
1 2 3
1 3 4
2 3 2

Saída:
3

Added by: Wanderley Guimarăes


Date: 2012-12-14
Time limit: 1s
Source
50000B
limit:
Cluster: Cube (Intel Pentium G860 3GHz)
All except: AWK CLOJ ERL F# GO JS NODEJS PERL 6 PYTH 3.2.3 n SCALA SED
Languages:
TCL
Resource: OBI 2008 - fase 2 nível 2

You might also like