Programação – Fase 1 Nível Júnior Turno B

Aula de Matemática

Solução escrita por Márcio Vitor

Conhecimentos necessários:

Dados inteiros $$A,B$$ o problema pede o máximo entre $$A + B$$ e $$A – B$$, podemos fazer isso lendo os dois inteiros e usando a função $$max$$ da biblioteca padrão (Note que também é possível usar um $$if$$ para verificar qual o maior entre os dois).

Clique aqui para ver o código completo.

Dança de Quadrilha

Solução escrita por Otávio Pinheiro

Conhecimentos necessários:

Perceba que a direção do movimento de Elena alterna após cada anúncio do marcador. Ou seja, o primeiro movimento é marcado no sentido horário, o segundo no anti-horário, e assim sucessivamente.

Como Elena percorre 1 metro por segundo, a distância percorrida em cada movimento é exatamente igual ao intervalo de tempo correspondente. Dessa forma, podemos representar os movimentos no sentido horário como valores positivos e os movimentos no sentido anti-horário como valores negativos.

S=t1t2+t3t4+...S = t_1 – t_2 + t_3 – t_4 + …

O problema também pede para imprimir a resposta final como módulo, então devemos retornar |S||S|.

O código para implementar isso consta manter um inteiro S e iterar de 0 à N, sendo que se o iterador estiver em uma posição par iremos incrementar tit_i em S e, caso contrário, estiver numa posição ímpar, vamos decrementar tit_i em S.

Finalmente retornamos |S||S| usando a função absabs. Como percorremos o vetor apenas uma vez, a complexidade de tempo da solução é O(N)O(N)

Clique aqui para ver o código completo

Fichas

Solução escrita por Enzo Hirota

Conhecimentos necessários:

Usaremos o seguinte algoritmo para resolver o problema:

  • Pegaremos a maior quantidade de fichas de $$R$ 10 $$
  • Pegaremos a maior quantidade de fichas de $$R$ 5 $$ do que sobrou
  • Pegaremos a maior quantidade de fichas de $$R$ 2 $$, do que sobrou
  • Pegaremos a maior quantidade de fichas de $$R$ 1 $$, do que sobrou

Executando esses passos nesta ordem, o problema será resolvido, agora resta provar que isso funciona:

Prova: Note que os números de $$1$$ até $$4$$ podem ser escritos, como as seguintes somas de fichas:

$$1=1$$$$2=2$$$$3=2+1$$$$4=2+2$$

Terminaremos agora com um argumento da troca, suponha que na nossa solução possuímos as seguintes quantidades de fichas para cada valor: $$q_1, q_2, q_5, q_{10}$$.

Agora suponha que solução possui menos de $$q_{10}$$ fichas de $$R$10$$, então conseguimos somar um número entre $$10$$ e $$14$$, usando apenas as fichas de valor $$1, 2$$ e $$5$$, já que enquanto a soma não superar $$10$$, podemos adicionar uma ficha, e quando for maior ou igual a $$10$$, não será maior que $$14$$, já que pode-se adicionar no máximo $$5$$ por vez, assim:

  • Se a soma for exatamente $$10$$, troca por uma ficha de $$R$10$$, assim diminuindo o número de fichas
  • Se a soma for entre $$11$$ e $$14$$, note que usaremos no mínimo $$3$$ fichas, então se trocarmos por uma ficha de $$R$10$$, e o que sobrar por como está escrito na tabela, trocaremos por no máximo $$3$$ fichas, assim não piorando a resposta.

Usando argumento análogo para as fichas de $$R$5$$ e $$R$2$$, provamos que nossa resposta é pelo menos tão boa, quanto a suposta resposta ótima. Desse modo provamos que realmente utilizamos a menor quantidade de fichas.

Clique aqui para ver o código completo

Solução extra: O problema, se resume essencialmente a um knapsack, o resto é deixado ao leitor, pode se ler mais sobre em Problema da Mochila, tendo um código para solução