OBOI 2024 - Fase 1 - Nível Júnior
Se você quiser se preparar para a OBI, não deixe de conferir o Roteiro de estudos de informática, e também a página de informática do NOIC, com todos os nossos materiais.
Damas
Comentário por Henrique Vianna
Conhecimento prévio necessário:
Para achar a resposta para uma dada dama , basta checarmos para cada outra dama
se ela se encontra na mesma linha, coluna ou diagonal de
. Para tanto, deve-se checar os seguintes casos:
- Mesma linha: verdade se
.
- Mesma coluna: verdade se
.
- Mesma diagonal: verdade se
.
Se qualquer uma dessas condições for verdadeira, deve-se somar à resposta de
. Então, basta fazer dois loops, um para cada dama
e outro passando por cada dama
.
Pedras
Escrito por Murilo Maeda Kataoka
Conhecimento prévio necessário:
Perceba que, devido à alta quantidade de pedras que podem estar na pilha, não é possível, para a solução completa, simplesmente simular as jogadas. Dessa forma, é necessária a observação de que, quando o número de pedras ,, tem resto:
- 0 na divisão por 3: Lalic ganha.
- 1 na divisão por 3: Lalic ganha
- 2 na divisão por 3: Enzo ganha
A partir disso, basta checar qual o resto de na divisão por 3 e imprimir o resultado correto.
Cartomância
Escrito por Caique Paiva
Conhecimentos Prévios Necessários:
A ideia vai ser manter quatro variáveis auxiliares , onde
vai ser a menor e a maior pontuação possível do Lobo e
a menor e a maior pontuação possível do Enzo. Além disso, mantenha mais uma variável booleana
, que mantém se o jogo é um empate ou não (Só vamos alterar ela caso, em algum momento, a pontuação do Enzo e do Lobo aumentem de maneiras distintas). Vamos fazer um for para percorrer todas as letras da string. Na i-ésima interação do for, vamos chegar os casos referente a i-ésima letra:
- Se
e
, portanto, a pontuação de Lobo e de Enzo aumentam da mesma maneira, logo, temos 2 casos
- Se
, então, a resposta de Lobo e de Enzo podem aumentar ou não, mas elas vão aumentar juntas, ou seja, não alteramos a variável empate, e aumentamos ambas as respostas máximas (
e
) em
.
- Caso contrário,
- Se
, aumente
em
.
- Caso contrário, faça nada.
- Se
- Se
- Caso contrário, se
, veja que agora, as pontuações de Lobo e de enzo podem crescer de maneiras distintas, ou seja, pode acontecer de a pontuação de Lobo aumentar e Enzo não, e vice versa. Portanto, alteramos a variável empate para falso, e aumentamos a resposta máxima de Lobo e de Enzo (
) em
, pois ambas as pontuações deles podem aumentar.
- Caso contrário
- Se
, com o mesmo raciocínio acima, alteramos a variável empate para falso, e aumentamos
em
- Caso contrário, aumente
e
caso
.
- Se
- E faça esse mesmo if para a string
:
- Se
, com o mesmo raciocínio acima, alteramos a variável empate para falso, e aumentamos
em
- Caso contrário, aumente
e
caso
.
- Se
Pronto, lidamos com todos os casos! Agora, basta ver o resultado de cada variável e ver o que ele nos entrega:
- Caso
, ou seja, a menor resposta possível de Lobo é maior que a maior resposta possível de Enzo, logo, Lobo sempre ganha
- Caso contrário
, pelo mesmo argumento, Enzo sempre ganha de Lobo
- Caso contraŕio, verifiquemos a variável empate
- Caso empate seja verdadeiro, imprima empate
- Caso contrário, imprima indefinido
Espelhos
Comentário escrito por João Pedro Castro
Conhecimentos Prévios Necessários:
As primeiras três parciais se resumem à trocar manualmente os dígitos pela sua versão "espelhada". O único conhecimento necessário fora de loops/vetores é o da regra de divisibilidade do 3: a soma dos algarismos na forma decimal ser divisível por 3 implica que o número é divisível por 3, e o contrário também é válido. Isso vem do fato que .
A solução completa vem de uma observação da operação de espelho: ela não tem nenhum efeito na divisibilidade por 3 de qualquer intervalo. E a razão é muito simples, perceba que: . E como individualmente, para um único dígito, não existe diferença no resto da divisão por 3, para a soma de vários dígitos também não existirá qualquer diferença.
Por fim, só é necessário realizar uma soma de prefixo para pode calcular a soma de todos os dígitos de um intervalo em . A complexidade final é
.