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.