Tacos de Bilhar
Autor(es): Dayna Prado
Jogos de bilhar, em que tacos são usados para arremessar uma bola contra outras em uma mesa, têm muitas variantes, como sinuca, mata-mata, bilhar francês e outras. O Sr. Jorge é um renomado artesão que fabrica tacos de bilhar sob encomenda.
Cada vez que um cliente pede um taco de um dado comprimento, o Sr. Jorge primeiro verifica se ele tem um taco com esse comprimento no estoque.
Assim, ele nunca tem no estoque mais do que um taco com um determinado comprimento. O estoque do Sr. Jorge está muito grande, e ele tem perdido muito tempo procurando por tacos. Ele pensa em usar um sistema computadorizado para manter o seu estoque de tacos.
Objetivo
Dadas as consultas ao estoque, calcule o número total de tacos fabricados, supondo que inicialmente o estoque esteja vazio.
Entrada
A primeira linha da entrada contém um inteiro C que indica o número de consultas ao estoque. A segunda linha contém C números inteiros, indicando as consultas ao estoque. Cada valor de consulta indica o comprimento de um taco desejado.
Saída
Seu programa deverá imprimir um único número, o número de tacos fabricados.
Restrições
Informações sobre a pontuação
Em um conjunto de casos de teste equivalente a 40 pontos, C ≤ 1000.
Exemplos
| Entrada | Saída |
|---|---|
| 4 80 100 80 50 |
6 |
| 1 1000 |
2 |
Para resolver este problema de forma eficiente, utilizamos a estrutura de dados Set (Conjunto). O enunciado garante que o estoque nunca terá mais de um taco do mesmo comprimento, funcionando como um interruptor: ou tem (1), ou não tem (0).
A lógica aplicada é:
Essa abordagem garante complexidade O(C), o que é ideal dado que C pode chegar a 10^5.
Código em JavaScript:
var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var lines = input.trim().split(/\s+/);
// lines[0] eh o numero de consultas C
var C = parseInt(lines[0]);
// Usamos um Set para representar o estoque
// O Set armazena apenas valores unicos
var estoque = new Set();
var fabricados = 0;
// Percorre todas as consultas (comecando do indice 1)
for (var i = 1; i <= C; i++) {
var pedido = parseInt(lines[i]);
if (estoque.has(pedido)) {
// Se tem no estoque, vende (remove do estoque)
estoque.delete(pedido);
} else {
// Se nao tem, fabrica 2
fabricados += 2;
// Vende um e guarda o outro no estoque
estoque.add(pedido);
}
}
console.log(fabricados);