OBI 2018 - Fase 2 - Programação Nível Júnior
Para conferir a prova na íntegra, clique aqui
Para ver todos os materiais incrível produzidos pela equipe NOIC para a OBI, veja a página de informática.
Copa
Comentário escrito por Enzo Dantas
Conhecimento prévio necessário:
A ideia é a seguinte, seja as posições dos jogadores Mestre Kung e Mestre Lu:
- Dois jogadores vão se encontrar na final se, um deles estiver entre
e outro estiver entre
, pois senão, eles vão ter se encontrado antes. Portanto, se isso for verdade, vamos retornar "final" no nosso código e parar o algoritmo.
- Agora, se os dois estiverem entre
, vamos fazer
e
, e então, os dois jogadores vão estar entre
. Veja que isso não vai mudar a resposta do problema, pois a estrutura do torneio para
é a mesma para
. (A partir daqui, as ideias são análogas).
- Dois jogadores vão se encontrar na semifinal se, um deles estiver entre
e outro estiver entre
, então, se isso for verdade, vamos retornar "semifinal" no nosso código e parar o algoritmo.
- Se os dois estiverem entre
, vamos fazer
e
, e então, os dois jogadores vão estar entre
.
- Dois jogadores vão se encontrar nas quartas de final se, um deles estiver entre
e outro estiver entre
, então, se isso for verdade, vamos retornar "quartas" no nosso código e parar o algoritmo.
- Se os dois estiverem entre
, vamos fazer
e
, e então, os dois jogadores vão estar entre
.
- Daí, basta retornar oitavas.
Por exemplo, no sample , veja que eles não vão se encontrar na final, e ambos estão entre
. Além disso, eles não vão se encontrar na semifinal, e eles estão entre
, logo vamos olhar o par
. Então, sabemos que eles vão se encontrar nas quartas.
Clique aqui para conferir o código
Clique aqui para conferir a solução em vídeo feita pelo NepsAcademy
Pesos
Comentário escrito por Estela Baron
Conhecimento prévio necessário:
Observe que, para subir um peso grande, é necessário já ter um peso menor (ou nenhum) cuja a diferença seja menor ou igual a 8. Portanto, podemos adotar a seguinte estratégia: vamos fazer uma série de operações para subir o maior peso, pois depois subiremos o segundo maior, o terceiro maior e assim por diante. Isso somente é possível em razão de o número de viagens não ter nenhuma restrição.
Para subir o maior peso, caso ele seja maior que 8, é necessário que tenha uma caixa mais leve (se fosse mais pesada, o atual peso não seria o maior - estamos só considerando movimentar os pesos menores que o maior). A diferença é no máximo 8, ou seja, a segunda caixa mais pesada pode ter uma diferença de no máximo oito unidades. Assim, podemos ordenar os valores em ordem crescente ( podemos até incluir o 0 para representar o elevador vazio) e verificar se a diferença entre dois termos adjacentes não ultrapassa 8. Caso ultrapasse, a resposta é 'N', senão é 'S'.
Clique aqui para conferir o código
Clique aqui para conferir a solução em vídeo feita pelo NepsAcademy
Cápsulas
Comentário escrito por Caique Paiva
Conhecimento prévio necessário:
Seja a quantidade de moedas que ganhamos até o dia
. Veja que
Pois, se até o dia ganhamos
moedas, então, no dia
, como é impossível de perder moedas no problema, continuamos com pelo menos
moedas. Então,
é crescente. Agora, veja que
Pois, no dia ganhamos uma moeda em cada dia, isso até
, e o
máximo que isso é verdade é o
, então, basta aplicar isso para todas as moedas e somar todas as respostas, que conseguimos
.
Portanto, queremos achar o menor tal que
, e além disso, sabemos como calcular
em
e que
é crescente, então, vamos fazer uma busca binária!! Faça
, então, vamos fazer o seguinte loop:
- Enquanto
, seja
, logo, se
, então, façamos
, pois sabemos que
. Se não, faça
, pois sabemos que
.
Daí, basta retornar .
Clique aqui para conferir a solução em vídeo feita pelo NepsAcademy