Programação – Fase 1 Nível 2 Turno B

Dedos

Solução escrita por Julia Tiosso

Conhecimentos necessários:

Seja $$N$$ o número indicado por Rafaela. Então, $$N = (16*D_1)+(8*D_2)+(4*D_3)+(2*D_4)+(1*D_5)$$. Assim, basta ler os valores de cada um dos dedos e imprimir o resultado $$N$$.

Em outras palavras, o enunciado dá a representação binária de um número $$(D_1D_2D_3D_4D_5)_2$$ e pede sua conversão para a base decimal.

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

Transporte

Solução escrita por Julia Tiosso

Conhecimentos necessários:

O algoritmo que vamos realizar consiste em tentar agrupar o máximo de estudantes possível em um mesmo transporte. Assim, garantimos que usamos a quantidade mínima de ônibus.

Dessa maneira, vamos atribuir inicialmente o primeiro ônibus ao estudante de tempo $$t_1$$. Suponha que estamos atualmente preenchendo um ônibus que começa no estudante $$j$$ e queremos decidir se o estudante $$i$$ pode entrar nesse mesmo ônibus:

  • Se $$t_i$$ $$-$$ $$t_j > K$$, então o estudante $$i$$ não pode embarcar nesse transporte, pois isso implicaria que $$j$$ esperaria mais de $$T$$ segundos. Então um novo ônibus que começa no estudante $$i$$ deve ser contratado.
  • Senão, $$i$$ consegue entrar nesse transporte e seguimos tentando agrupar os próximos estudantes.

Clique aqui para ver o código completo.

Resumo de Números

Solução escrita por Márcio Vitor

Conhecimentos necessários:

Um fato interessante é que é possível provar que o único número chato é o $$321$$, ou seja basta usar um $$while$$ loop enquanto o número atual $$N$$ for diferente de $$321$$ então aplique a operação de resumo no número iterando pelos dígitos e contando quantos são pares ($$P$$), ímpares ($$I$$) e a quantidade total ($$T$$) e troque $$N$$ por $$100*T + 10*I + P$$.

Para iterar pelos dígitos de um número use o fato que para um inteiro $$X$$, o dígito das unidades é $$x \pmod{10}$$ e podemos usar a divisão do c++ trocando $$x$$ por $$\lfloor \frac{x}{10} \rfloor$$ para remover o dígito mais à direita, para mais detalhes olhe o código abaixo.

Note que é possível iterar pelos dígitos usando o tipo string e convertendo cada caractere para o tipo inteiro

Clique aqui para ver o código completo.