Home page da disciplina MAC 324 | Mapa do sítio da disciplina |
A sistemática seguida referente a estas questões encontra-se na página: Especificações para a entrega do exercício de programação. Daqui em diante supomos que Você leu aquela página na íntegra.
Considere um conjunto de prédios de forma retangular. A sua silhueta é a projeção dos prédios num plano imaginário atrás de todos eles.
Escreva um programa em Java que calcula eficientemente a silhueta de um conjunto de n prédios dados.
Uma silhueta pode ser representada por uma sequência de inteiros positivos (c[0],h[1],c[1],h[2],c[2],...,h[n],c[n]) onde os c[i] são comprimentos de segmentos horizontais de altura h[i]. A origem da silhueta é o ponto de coordenadas (0,0) e o seu término é o ponto de coordenadas (soma(c[i]),0).
Note que a silhueta de um prédio retangular é uma sequência da forma (c[0],h[1],c[1]).
O procedimento básico do seu programa deve ser um algoritmo para calcular a união de duas silhuetas dadas.
Por exemplo, dadas as silhuetas
(3, 6,4, 2,1, 9,4, 4,4, 17,3, 14,3, 9,5) e (5, 4,4, 13,5, 6,4, 16,2, 11,3, 5,2)a sua união é a silhueta
(3, 6,4, 4,1, 9,1, 13,5, 6,2, 17,3, 16,1, 14,2, 11,1, 9,4),conforme está representado no desenho a seguir. Note que as linhas mais grossas correspondem à silhueta do conjunto.
Uma estratégia muito eficiente consiste em dividir os prédios dados em duas "metades", calcular recursivamente a silhueta de cada "metade" e calcular a união das duas silhuetas obtidas.
Outra alternativa mais simples mas menos eficiente consiste em construir as silhuetas dos m primeiros prédios, para cada valor de m, tomando a união dos m-1 primeiros prédios com o m-ésimo.
Além das solicitações nas Especificações para a entrega do exercício de programação entregue também os resultados que o seu programa fornece para o exemplo dado, considerando separadamente os treze prédios do exemplo. Ou seja, não use o agrupamento de prédios do exemplo, use apenas os prédios propriamente ditos, conforme na sequência abaixo de dados:
(3,6,4) (5,4,4) (7,2,1) (8,9,4) (9,13,5) (12,4,4) (14,6,4) (16,17,3) (18,16,2) (19,14,3) (20,11,3) (22,9,5) (23,5,2)
Uma companhia que vende software precisa acomodar n arquivos, de tamanhos t=(t[1],t[2],...,t[n]), em disquetes de capacidade C, sendo que t[i]<=C, para cada i.
Faça um programa em Java que aloca os arquivos no menor número possível de disquetes.
Exemplo: C=360 arquivo 1 2 3 4 5 6 7 8 9 tamanho 40 80 80 80 100 100 100 240 240 disquete 1 1 2 2 2 2 3 1 3
No caso, são necessários 3 disquetes para acomodar os 9 arquivos, já que eles nao cabem em dois disquetes cuja capacidade é de 720. Note que se os arquivos fossem alocados na ordem que surgem, da esquerda para a direita, haveria necessidade de quatro disquetes.
Uma forma de testar o seu programa, é variar a ordem de apresentação dos arquivos e verificar se o número de disquetes se mantem ou não.
Outra forma de testes é repartir a capacidade de um certo número de disquetes em arquivos de tamanhos bem diferentes e apresentar os dados bem embaralhados para o programa. Ou seja, obter os dados a partir de uma solução pré-estabelecida. Por exemplo:
360=20+40+60+80+100+10+50 360=70+110+180 360=15+25+35+45+55+65+75+22+23
Tente resolver agora a sequência:
10 15 20 22 23 25 35 40 45 50 55 60 65 70 75 80 100 110 180
em diversas ordens.
Outro teste ainda: duplique cada arquivo (tome dois de 10, dois de 15, etc) e veja se o programa aloca os arquivos em 6 disquetes.
No relatório explique a função de cada variável no programa. Explique sucintamente o método que Você usou para gerar a solução. Divida o seu programa em blocos convenientes e explique também sucintamente a função de cada bloco.
A grosso modo, o seu programa vai ter que enumerar todas as possibilidades de alocação dos arquivos em um certo número de disquetes e escolher uma configuração que usa o mínimo de disquetes.
Obviamente, a melhor estrategia é Você estar absolutamente convencido de que o seu programa funciona corretamente através do entendimento completo do algoritmo utilizado. Neste caso Você não precisará se preocupar com tantos testes. É sempre bom lembrar porém que João Seguro morreu de velho.
Além das solicitações nas Especificações para a entrega do exercício de programação entregue também os resultados que o seu programa fornece para os exemplos dados.
Dúvidas, pergunte ao Professor (mas não suponha que Você receberá uma resposta):
Imre Simon <is@ime.usp.br>
Home page da disciplina MAC 324 | Mapa do sítio da disciplina |
e-mail:
Imre Simon <is@ime.usp.br>