Cabo de Guerra

Solução escrita por Malu Azevedo

Conhecimentos necessários:

O problema nos pede para encontrar a quantidade mínima de cabos necessária (1, 2 ou 3) para obter um comprimento total maior ou igual a XX, considerando que ao amarrar dois cabos perdemos 10 cm nos nós. Se não for possível nem com 3 cabos, devemos imprimir -1.

Ideia Central

Para encontrar a quantidade mínima de cabos necessária para atingir ou superar o comprimento MM, percebemos que para formar a maior soma possível com 1, 2 ou 3 cabos, devemos sempre escolher os maiores cabos disponíveis no depósito. Assim, não precisamos ordenar todos os elementos; basta mantermos os três maiores comprimentos encontrados durante a leitura dos dados. Se o maior cabo sozinho for suficiente, a resposta é 1. Caso contrário, se a soma dos dois maiores cabos (descontando 10 cm do nó) atingir XX, a resposta é 2. Se a soma dos três maiores cabos (descontando 20 cm dos nós) for suficiente, a resposta é 3. Caso nenhuma dessas opções atinja o valor desejado, é impossível resolver o problema, retornando -1.

Abordagem completa

Lemos NN e XX, e mantemos um vetor de três posições chamado top para armazenar os três maiores valores lidos até o momento em ordem decrescente. Para cada cabo lido, atualizamos essa estrutura comparando o novo valor com os maiores atuais de forma eficiente. Após processar todos os cabos em um único loop, testamos sequencialmente as condições: primeiro verificamos se o maior cabo (top[0]) é maior ou igual a XX, se não for, testamos se a soma de top[0] e top[1] menos 10 atinge XX, por fim, testamos se a soma dos três maiores (top[0] + top[1] + top[2]) menos 20 é suficiente. Se nenhuma condição for atendida, imprimimos -1. A complexidade de tempo é linear O(N)O(N).

Clique aqui para ver o código completo.