Sei sulla pagina 1di 13

Universidade do Estado Santa Catarina - UDESC

Departamento de Cincia da Computao - DCC


Universidade Federal do Paran - UFPr
Departamento de Informtica - DInf
2
o.
Treino UDESC - UFPR 2008
Organizadores: Claudio (DCC) e Andr Guedes (DInf)
21 de julho de 2008
Lembrete:
permitido consultar livros, anotaes ou qualquer outro material impresso cpia durante a prova.
A correo automatizada, portanto siga atentamente as exigncias da tarefa quanto ao formato da
entrada e sada de seu programa.
Todos os problemas tm o mesmo valor na correo.
Procure resolver o problema de maneira eciente. Na correo, a ecincia tambm levada em conta.
As solues sero testadas com outras entradas alm das apresentadas como exemplo dos problemas.
Nas implementaes, as entradas e as sadas conhecidas sero padro (ler e escrever na sada padro).
Utilize o Clarication para dvidas da prova. Opcionalmente, os juzes respondem, contudo, as respostas
so acessveis a todos.
1
Problema A: Computador de Palavras
Arquivo: string.[c|cpp|java]
A DataAzul comprou recentemente o seu mais novo computador, um computador de processa-
mento de palavras dubbed o X9091. Espera-se que tenha alguma valor/utilidade para criptograa e
reas ans. (Se espalham boatos que os chineses esto trabalhando em um clone que corrija tal codi-
cao criptogrca, mas ns ignoraremos tal rumor). Este computador aceitar entradas de palavras
e produzir como sada outras palavras, dependendo do programa carregado dentro dele naquele mo-
mento. O chip da CPU de uma ltima gerao com tecnologia RISC. Contudo, este tem somente
trs instrues na transformao de palavras:
D Delete ou exclua um caracter numa posio em particular.
I Insira um caracter em uma posio em particular.
C Mude o caracter de uma posio em particular por um outro caracter diferente. Isto , troque de
caracter em uma dada posio.
Os programas escritos para esta mquina esto em um formato de cdigo de mquina onde cada
instruo tem o formato ZXdd, onde Z representa o cdigo para uma instruo (D, I ou C), X um
carter e o dd representa um nmero de dois dgitos. Um programa terminado por uma instruo
especial da parada que consiste na letra E. Observe que cada instruo trabalha sobre a palavra na
memria cada vez que a instruo executada.
Para ver como tudo isso funciona considere o seguinte exemplo. Deseja-se transformar a palavra
abcde para palavra bcgfe. Isto poderia ser obtido por uma srie de comandos da mudana (C),
mas este no seria minimal. O seguinte programa melhor:
abcde
Da01 bcde % observe o a necessrio porqu ele vericado pelo hardware
Cg03 bcge
If04 bcgfe
E bcgfe % Trmina o programa
Escreva um programa que leia duas palavras (uma palavra de entrada e a palavra de sada ou alvo)
e produza um programa minimal em X9091 necessrio transformar a palavra de entrada na palavra
de sada. Desde que pode haver umas solues mltiplas, somente uma deve ser produzido. Qualquer
soluo que satisfaa estes critrios ser aceita.
A entrada consistir em uma srie das linhas, cada linha que contem duas palavras separadas por
exatamente um espao. As palavras tem no mximo 20 carteres em minsculos. O arquivo ser
nalizado por uma linha contendo um nico #.
A sada consistir em uma srie das linhas, uma para cada linha da entrada. Cada linha consiste
em um programa na lnguagem X9091.
Entrada
abcde bcgfe
#
Sada
Da01Cg03If04E
2
Problema B: Theseu e o Minotauro?
Arquivo: theseu.[c|cpp|java]
Aqueles de vocs com educao clssica devem lembrar da lenda de Theseu e o Minotauro. Esta a
fbula envolvendo um mostro com cabea de touro, um labirinto subterrneo com pequenas passagens
parecidas, amores perdidos de donzelas em bolas de seda. Na linha educacional desta competio,
iremos agora revelar a verdadeira estria.
O labirinto era na verdade uma srie de cavernas conectadas por passagens diretas, algumas das
quais s podiam ser atravessadas em uma direo. Para encurralar o Minotauro, Theseu levou escon-
dido consigo uma grande quantidade de velas para dentro do Labirinto, pois ele havia descoberto que
o Minotauro tinha medo da luz. Theseu cminhou a esmo at ouvir o Minotauro aproximando-se pelo
tnel. Neste momento ele acendeu uma vela e partiu em perseguio. O Minotauro bateu em retirada
para dentro da caverna da qual havia sado e fugiu por outra passagem. Theseu o seguiu lentamente,
at que encontrou a k-sima caverna desde que ele acendeu a vela. Aqui ele teve tempo suciente
para colocar a vela acesa no meio da caverna, acender outra vela naquela e continuar a perseguio.
Com o progresso da perseguio, uma vela era deixada em cada k-sima caverna que era atravessada,
assim limitando o movimento do Minotauro. Sempre que o Minotauro entrava numa caverna ele
devia checar as sadas em uma ordem especca, fugindo por aquela que no levasse diretamente a
uma caverna iluminada. (Lembre-se que como Theseu carregava uma vela acesa, o Minotaura nunca
saia da caverna pelo tnel usado para entrar nela). Eventualmente o Minotauro cou encurralado,
possibilitando Theseu derrot-lo.
Considerando os Labirintos a seguir como exemplo, onde no caso o Minotauro verica as sadas
das cavernas em ordem alfabtica:
A E
G H D C
B F
Figura 1: Uma caverna em ordem alfabtica
Assumindo que Theseu est na caverna C quando ouve o Minotauro aproximando de A, e para
este cenrio o valor de K 3. Ele acende a vela e comea a caada, perseguindo o Minotauro atravs
de A, B, D (deixa uma vela), G, E, F (outra vela), H, E, G (outra), H, E (encurralado).
Escreva um programa que simular a perseguio de Theseu ao Minotauro. A descrio do la-
birinto vai identicar cada caverna por um caractere maisculo e ir listar as cavernas alcanveis a
partir daquela na ordem que o Minotauro ir tentar, seguida dos identicadores para as cavernas as
quais o Minotauro e teseu estavam e quando o contato foi feito pela primeira vez, seguido pelo valor
de k. O arquivo de entrada consistir de uma srie de linhas. Cada linha descrever um cenrio no
formato mostrado abaixo(que descreve o exemplo acima). Nenhuma linha poder conter mais de 255
caracteres. O arquivo ser nalizado por uma linha com apenas o caractere #.
O arquivo de sada ir consistir de uma linha para cada labirinto. Cada linha ir identicar as
cavernas iluminadas, na ordem na qual as velas foram deixadas, e a caverna na qual o Minotauro est
encurraldo, seguindo o formato mostrado abaixo.
Entrada
A:BCD;B:AD;D:BG;F:H;G:DEH;E:FGH;H:EG;C:AD. A C 3
3
#
Sada
D F G /E
4
Problema C: Shellsort
Arquivo: shellsort.[c|cpp|java]
O Rei Yertle deseja rearranjar o seu trono para colocar os seus maiores nobre e conselheiro mais
ntimos prximos do topo. Apenas uma operao est disponvel para alterar a ordem das tartarugas:
uma tartaruga pode escalar de sua posio e sentar no topo. Dada uma ordem original de tartarugas e
uma ordem desejada seu trabalho encontrar a mnima seqncia de operaes e rearranjar a ordem
original para a ordem desejada.
Entrada
A primeira linha da entrada consiste em um nico inteiro k informando o nmero de casos de teste.
Cada caso de teste consiste em um inteiro n informando o nmero de tartarugas seguido de n linhas
descrevendo a ordem original. Cada linha contm o nome da tartaruga, iniciando com a tartaruga do
topo descendo at a base. As tartarugas tem nomes nicos, a quais so strings de no mais do que oito
caracteres compostos por caracteres alfa-numricos, espao e ponto ."). As prximas n linhas da
entrada referem-se a ordem desejada para as tartarugas, novamente nomeando-as do topo at a base.
Cada caso de teste consiste em extamente 2n + 1 no total. O nmero de tartarugas (n) dever ser
menor ou igual a 200.
2
3
Yertle
Duke of Earl
Sir Lancelot
Duke of Earl
Yertle
Sir Lancelot
9
Yertle
Duke of Earl
Sir Lancelot
Elizabeth Windsor
Michael Eisner
Richard M. Nixon
Mr. Rogers
Ford Perfect
Mack
Yertle
Richard M. Nixon
Sir Lancelot
Duke of Earl
Elizabeth Windsor
Michael Eisner
Mr. Rogers
Ford Perfect
Mack
Sada
Para cada caso de teste, a sada consiste em uma seqncia de nomes de tartarugas, uma por linha,
indicando a ordem na qual as tartarugas deixam suas posies para escalar at o topo. Esta sequncia
5
de operaes dever transformar a seqncia original na seqncia desejada e deve ser a mais curta
possvel. Se mais de uma soluo soluo de menor tamanho for possvel, qualquer uma das solues
pode ser reportada. Imprima uma linha branca depois de cada caso de teste.
Duke of Earl
Sir Lancelot
Richard M. Nixon
Yertle
6
Problema D: Back to the Future
Arquivo: future.[c|cpp|java]
Um grupo de amigos resolveu ir a Alemanha para apoiar a seleo brasileira em sua jornada
gloriosa rumo ao hexa. Como as passagens areas e as estadias eram caras, cada um trouxe uma
quantidade de dinheiro que julgou suciente para passar o ms com conforto e voltar para casa sem
problemas. Porm, aps a bela campanha do Brasil na copa do mundo, o grupo de amigos se viu
obrigado a gastar o dinheiro que tinha guardado para as etapas nais da copa com a famosa cerveja
alem. As conseqncias de tais atos foram terrveis. Aps uma grande bebedeira, todos foram pegos
pela polcia local dormindo na rua, e receberam multas pesadssimas. Alm disso, todos perderam
suas passagens de volta. Devido a esses contratempos, a viagem de volta cou ameaada. De repente,
eles descobriram que precisavam voltar para casa gastando a menor quantidade possvel de dinheiro.
Analisando as rotas areas disponveis, os amigos notaram que em todas as rotas o nmero de assentos
disponveis nos avies era sempre o mesmo. Porm, os preos das viagens entre uma cidade e outra
eventualmente variavam bastante. Assustados com a possibilidade de no encontrar lugares suciente
nos avies para que todos pudessem voltar e preocupados em gastar a menor quantidade possvel de
dinheiro, o grupo de amigos resolveu pedir sua ajuda.
Entrada
O problema composto por vrias instncias. Cada instncia comea com uma linha comdois inteiros
positivos n (2 n 100) e m (1 m 5000), onde n o nmero de cidades que pertencem s m
rotas de vo consideradas. Os amigos querem ir da cidade 1 at a cidade n. Nas prximas m linhas
so fornecidos triplas de inteiros A B C descrevendo a rota do avio (A e B) e o preo da passagem
area por pessoa (C). Os valores de A e B esto entre 1 e n. As rotas so bidirecionais (ou seja, h um
vo de A at B e um vo de B at A com preo C) e haver no mximo uma rota entre duas cidades.
Na prxima linha so dados dois inteiros, D e K, onde D o nmero de amigos e K o nmero de
assentos livres em cada vo. Cada rota s pode ser utilizada uma vez.
4 5
1 4 1
1 3 3
3 4 4
1 2 2
2 4 5
20 10
4 4
1 3 3
3 4 4
1 2 2
2 4 5
20 100
4 4
1 3 3
6
3 4 4
1 2 2
2 4 5
20 1
7
Sada
Para cada instncia, imprima a linha Instancia k, onde k o nmero da instncia atual. Alm
disso, imprima a menor quantidade possvel de dinheiro que os amigos 11 vo gastar para voltar ao
Brasil (que est limitada por 1015). Caso no seja possvel escolher um conjunto de vos que levem
todos para casa, imprima impossivel. Imprima uma linha em branco aps cada instncia.
Instancia 1
80
Instancia 2
140
Instancia 3
impossivel
8
Problema E: Jugs
Arquivo: jugs.[c|cpp|java]
In the movie Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with the fol-
lowing puzzle. They were given a 3-gallon jug and a 5-gallon jug and were asked to ll the 5-gallon
jug with exactly 4 gallons. This problem generalizes that puzzle.
You have two jugs, A and B, and an innite supply of water. There are three types of actions that
you can use: (1) you can ll a jug, (2) you can empty a jug, and (3) you can pour from one jug to the
other. Pouring from one jug to the other stops when the rst jug is empty or the second jug is full,
whichever comes rst. For example, if A has 5 gallons and B has 6 gallons and a capacity of 8, then
pouring from A to B leaves B full and 3 gallons in A.
A problem is given by a triple (Ca,Cb,N), where Ca and Cb are the capacities of the jugs A and B,
respectively, and N is the goal. A solution is a sequence of steps that leaves exactly N gallons in jug
B. The possible steps are
fill A
fill B
empty A
empty B
pour A B
pour B A
success
where "pour A B"means "pour the contents of jug A into jug B", and "success"means that the goal
has been accomplished.
You may assume that the input you are given does have a solution.
Input Format
Input to your program consists of a series of input lines each dening one puzzle. Input for each
puzzle is a single line of three positive integers: Ca, Cb, and N. Ca and Cb are the capacities of jugs
A and B, and N is the goal. You can assume 0 < Ca <= Cb and N <= Cb <=1000 and that A
and B are relatively prime to one another.
Required Output Format
Output from your program will consist of a series of instructions from the list of the potential output
lines which will result in either of the jugs containing exactly N gallons of water. The last line of
output for each puzzle should be the line "success". Output lines start in column 1 and there should
be no empty lines nor any trailing spaces.
Sample Input
3 5 4
5 7 3
Sample Output
fill B
pour B A
empty A
9
pour B A
fill B
pour B A
success
fill A
pour A B
fill A
pour A B
empty B
pour A B
success
Comment - Por se tratar de um treino...
The solution above views the set of jug content pairs as vertices in a graph, with an edge from one
pair/vertex to another if and only if one of the pouring acts gets you from one conguration to the
other. In that perspective, the algorithm above is just a breadth-rst search of the graph. A depth-rst
search is ne too, and perhaps simpler with recursion, but this breadth-rst solution gives the shortest
sequence of jug operations to achieve a result.
10
Problema F: Rectangles
Arquivo: rectangles.[c|cpp|java]
A specialist in VLSI design testing must decide if there are some components that cover each
other for a given design. A component is represented as a rectangle. Assume that each rectangle is
rectilinearly oriented (sides parallel to the x and y axis), so that the representation of a rectangle con-
sists of its minimum and maximum x and y coordinates. Write a program that counts the rectangles
that are entirely covered by another rectangle. The input le contains the text description of several
sets of rectangles. The specication of a set consists of the number of rectangles in the set and the list
of rectangles given by the minimum and maximum x and y coordinates separated by white spaces, in
the format:
num_rectangles
xmin
1
xmax
1
ymin
1
ymax
1
xmin
2
xmax
2
ymin
2
ymax
2
....
xmin
n
xmax
n
ymin
n
ymax
n
The output should be printed on the standard output. For each given input data set, print one
integer number in a single line that gives the result (the number of rectangles that are covered).
Sample Input
3
100 101 100 101
0 3 0 101
20 40 10 400
4
10 20 10 20
10 20 10 20
10 20 10 20
10 20 10 20
Sample Output
0
4
11
Problem G: Circle Through Three Points
Arquivo: circle3.[c|cpp|java]
Your team is to write a program that, given the Cartesian coordinates of three points on a plane,
will nd the equation of the circle through them all. The three points will not be on a straight line.
The solution is to be printed as an equation of the form
(x h)
2
+ (y k)
2
= r
2
(1)
and an equation of the form
x
2
+ y
2
+ cx + dy e = 0 (2)
Each line of input to your program will contain the x and y coordinates of three points, in the
order A
x
, A
y
, B
x
, B
y
, C
x
, C
y
. These coordinates will be real numbers separated from each other by
one or more spaces.
Your program must print the required equations on two lines using the format given in the sample
below. Your computed values for h, k, r, c, d, and e in Equations 1 and 2 above are to be printed
with three digits after the decimal point. Plus and minus signs in the equations should be changed as
needed to avoid multiple signs before a number. Plus, minus, and equal signs must be separated from
the adjacent characters by a single space on each side. No other spaces are to appear in the equations.
Print a single blank line after each equation pair.
Sample input
7.0 -5.0 -1.0 1.0 0.0 -6.0
1.0 7.0 8.0 6.0 7.0 -2.0
Sample output
(x - 3.000)^2 + (y + 2.000)^2 = 5.000^2
x^2 + y^2 - 6.000x + 4.000y - 12.000 = 0
(x - 3.921)^2 + (y - 2.447)^2 = 5.409^2
x^2 + y^2 - 7.842x - 4.895y - 7.895 = 0
12
A
B
C
R
13

Potrebbero piacerti anche