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