OBI 2022 - Fase 1 - Programação Nível 2
Para se preparar para a OBI, confira o nosso Roteiro de Estudos, nele você vai encontrar um direcionamento completo de como estudar!
Para conferir a prova na íntegra, clique aqui.
Hotel
Escrito por Arthur Lobo
Conhecimento prévio necessário:
Primeiro vamos calcular qual foi o valor da diária paga pelo hospede e chamá-lo de . Para isso, vamos dividir em 2 casos:
- Ele chega antes do dia 16: se o hospede chega no dia , então o valor da diária aumentou em nos dias , ou seja, vezes no total, fazendo com que a .
- Ele chega depois do dia 16: chegando depois do dia 16, o valor da diária aumenta nos dias , ou seja, 14 vezes no total, fazendo com que .
Agora queremos saber quantos o hospede ficou no hotel, sabemos que ele chemou no dia e saiu no dia , passando os dias no hotel, ou seja,
Finalmente, o valor total gasto pelo hospede foi o valor da diária vezes quantos dias ele ficou no hotel, ou seja, .
Clique aqui para conferir o código
Bombom
Escrito por Enzo Dantas
Conhecimento prévio necessário:
Vamos manter uma variável chamada e uma variável chamada para contar os pontos de cada um. Para ler as cartas, vamos criar uma string e ler normalmente, sendo a figura da carta e o naipe. Em seguida, adicionamos os pontos correspondentes.
Clique aqui para conferir o código
Maior Valor
Escrito por Vitor Veiga
Conhecimento prévio necessário:
Temos três inteiros e temos que achar o maior número no intervalo de a tal que a soma de seus algarismos é . Para a questão, como os valores de e são pequenos, podemos percorrer todo esse intervalo testando cada um dos números presentes nele.
Para uma melhor solução desse problema, utilizaremos o truque de converter o número inteiro em uma string, para maior facilidade no manuseamento de seus algarismos. A ideia será percorrer, utilizando um for loop, o intervalo de a e, para cada um dos números, obter a soma de seus algarismos e checar se ela é igual a . Como estamos indo do maior ao menor número, quando a soma for igual a , temos nossa resposta.
Para obter a soma dos algarismos, basta transformá-lo em string, percorrer essa string utilizando um loop, e adicionar a um novo inteiro o valor de cada um dos dígitos, transformando-os de char para int.
Clique aqui para conferir o código
Chuva
Escrito por Caique Paiva
Conhecimento prévio necessário:
Vamos simplificar o problema:
Temos uma array de números. Queremos achar a quantidade de intervalos
tal que a soma dos elementos de até é igual a .
Então, temos que, usando uma soma de prefixos, a soma de elementos de até é , com . Logo, queremos achar a quantidade de pares tal que .
Vamos contar isso para cada , e depois somar tudo, ou seja, para um certo , vamos contar a quantidade de tal que . Então a ideia é a seguinte, vamos fazer um map onde guardamos a quantidade de vezes que o valor aparece na sequência de prefixo. Então, vamos fazer o seguinte algoritmo:
- Começamos colocando . E rodamos o algoritmo de até .
- No passo , adicionamos na resposta e depois somamos 1 ao .
Isso tá fazendo justamente o que nós queremos! Logo no final basta retornar a resposta. Esse algoritmo roda em (O aparece pois, para colocar um valor no map, é , onde é a quantidade de elementos no map. Se quiser fazer em , é tranquilo de trocar o map pelo vetor, mas se não tomar cuidado, pode dar MLE (Limite de Memória Excedido), por isso eu usei map nesse tutorial.