Tarefa 9 - Pesquisa e desenvolvimento

Prazo de entrega recomendado:

Vamos resolver alguns problemas do cotidiano de um certo laboratório de pesquisa. Enquanto não é difícil escrever algoritmos que respeitem as restrições de cada problema, nesta tarefa iremos perceber que, mesmo para problemas corriqueiros, precisamos estudar e escrever algoritmos eficientes.


1. Compras do laboratório

Maria é a pesquisadora responsável por organizar e comprar os equipamentos de seu laboratório de P&D. Os membros do laboratório mandam suas requisições, que são colocadas em uma lista de demandas, em que um mesmo item pode ser pedido por vários pesquisadores. Maria então consulta possíveis fornecedores para atender os pedidos de seus colegas.

Um fornecedor responde com uma lista de itens disponíveis, incluindo repetições. Seu objetivo é descobrir quais itens demandados Maria não pode comprar de um dado fornecedor. Escreva seu programa em um arquivo compras.py.

Atenção: nesta questão, não utilize as estruturas de dados set e dict, apenas list. Também estão proibidas as features que deixam o algoritmo implícito, como o operador de pertinência in. A sintaxe for x in X pode ser usada livremente. Qualquer dúvida, pergunte no canal da tarefa.

Entrada

Cada equipamento é representado por um número inteiro. A entrada é formada por duas linhas contendo as listas de números representando os itens demandados e os itens disponíveis.

5 9 2 5 3 2 1 1 9
1 5 4 3 3 7 4 7 8 2 2

Saída

A saída contém a lista de itens que não podem ser comprados, em ordem crescente.

1 5 9 9 

2. Cadeias fortes

O laboratório em que Maria trabalha pesquisa a criação de materiais super resistentes nunca vistos antes! Esses materiais hipotéticos são formados ligando pares de novos tipos de moléculas sintéticas — e super-secretas. Nem todas as moléculas podem ser ligadas, então Maria utiliza uma máquina — mais secreta ainda — que é capaz de identificar que pares de moléculas se ligam.

Os levantamentos preliminares dão indícios de que as qualidades inigualáveis dos materiais estudados são decorrentes da presença de cadeias fortes em sua composição. Uma cadeia forte é um trio de moléculas em que todas podem ser ligadas entre si, par a par. A figura abaixo mostra as conexões das moléculas 1, 2, 3, 5 e 99, onde estão presentes as cadeias fortes 1, 2 e 3, e a 2, 3 e 99.

A máquina de Maria só consegue analisar dois tipos de moléculas por vez, então a identificação de cadeias fortes precisa ser feita implicitamente a partir dos pares de moléculas conectáveis. Como o número de moléculas é muito grande, você foi contratado para automatizar essa tarefa. Crie um programa cadeias.py que, dados os pares de moléculas conectadas, liste todas as cadeias fortes.

Atenção: nesta questão está liberado o uso de todas as estruturas de dados vistas em aula.

Entrada

Cada tipo de molécula é representado por um número inteiro. A entrada é formada por um inteiro m na primeira linha, representando o número de pares de moléculas conectadas, seguido por m linhas que descrevem os pares, formados por números inteiros.

6
1 3
99 5
3 99
1 2
2 3
2 99

Saída

A saída contém uma lista de todas cadeias fortes em ordem lexicográfica. Cada cadeia forte é representada por uma linha a b c com $a < b < c$.

1 2 3
2 3 99

Dica

Existem muitos algoritmos diferentes que resolvem este problema. Uma primeira ideia é enumerar os trios de pares de moléculas conectadas e, em seguida, testar se uma cadeia forte é formada. Isso pode ser feito com três comandos for aninhados, percorrendo a lista que guarda os pares de moléculas. Saiba que apenas esse algoritmo não é capaz de resolver os casos de teste maiores: explore as estruturas de dados vistas em aula para obter um algoritmo mais eficiente!

Correção

Depois de submetida e terminada a tarefa, você deverá apresentá-la a um monitor PED. Para isso, você deve procurar atendimento em algum horário com monitor PED e digitar apresentar 9 no canal fila-apresentar.

Em cada problema, temos casos de teste pequenos, médios e grandes. Para obter o conceito C, você precisa resolver os casos de teste pequeno e médio do primeiro problema, além dos casos de teste pequenos do segundo problema. O conceito B é obtido ao resolver também os casos de teste médios do segundo problema. O conceito A é dado ao resolver todos os casos de teste.

Lembre-se de que seu programa deverá estar organizado em funções adequadamente, cada uma com uma responsabilidade bem definida. Crie uma função principal e não execute instruções no nível global. Não serão aceitos programas desorganizados ou ilegíveis. Procure adicionar comentários objetivos para documentar as funções e explicando o que fazem trechos de código mais complicados.

A pasta da tarefa no seu repositório vem inicialmente com um arquivo nao_corrigir.txt que serve para indicar que você ainda está trabalhando nesta tarefa. Você pode realizar quantos pushes quanto forem necessários. O monitor só irá corrigir sua tarefa quando esse arquivo for removido do repositório.