OBI 2024 - Fase 2 - Programação Nível 2 - Turno B
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 nossos materiais.
Game Show
Escrito por Caique Paiva
Conhecimentos Prévios Necessários:
Basta fazermos o que o problema pediu. Mantenha uma variavel chamada resposta, e inicialize ela com . Então, quando estou lendo o caractere
:
- Caso seja
, faça
- Caso contrário, faça
Salada de Frutas
Comentário por Fernando Gonçalves
Conhecimento Necessário:
Nesse problema, temos que achar, dada uma quantidade de dinheiro e os preços de diversas frutas, qual a máxima quantidade de tipos de fruta que podemos comprar.
Dessa forma, para um tipo de fruta, só precisamos considerar o menor preço disponível para a sua compra. Os demais preços de um mesmo tipo são irrelevantes, pois não faz sentido gastarmos mais do que o necessário na compra de uma fruta.
Agora, sabemos os preços que estamos dispostos a pagar por cada fruta, então só precisamos decidir quais nós compraremos.
Para maximizar a quantidade comprada, podemos escolher as frutas gulosamente, sempre escolhendo aquela de menor preço. A prova desse guloso é pelo argumento da troca: se eu tivesse comprado uma fruta de preço maior quando havia alguma com preço menor disponível, trocar a minha escolha para o preço menor não pode piorar a resposta.
Em suma, vamos guardar o menor preço de toda fruta, e comprá-las na ordem de preço crescente.
Clique aqui para conferir o código
Trio de Palitos
Escrito por João Pedro Castro
Conhecimentos Prévios Necessários:
Subtask 1 (30 pontos): 
Podemos simplesmente testar todas as triplas e somar
à resposta toda vez que conseguirmos formar um triângulo. Complexidade é
.
Subtask 2 (24 pontos): Existem exatamente dois tamanhos de palitinhos
Essa subtarefa é mais chata e envolve basicamente só combinatória. Vamos chamar um desses tamanhos de e o outro de
; enquanto a quantidade de palitinhos de tamanho
é
e analogamente a quantidade de palitinhos de tamanho
é
. Ambos valores são facilmente calculáveis com um loop.
Primeiro, percebam que podemos formar triângulos equiláteros com somente um tipo dos palitinhos. Logo vamos adicionar à resposta ; e a mesma coisa pro
.
Agora vamos analisar o outro caso, que é quando temos dois palitos de um tamanho e um de outro tamanho. Vamos resolver tratando como dois de tamanho e um de tamanho
, e depois vocês podem fazer a mesma coisa trocando os dois. Primeiro, se
não somamos nada. Agora caso contrário, a quantidade possível é
. Fica como exercício para o leitor expandir essa conta (aprendam a escolhe b!).
A complexidade é .
Subtask 3 (17 pontos): 
Essa é uma solução generalizada da subtask acima. Chame de como a quantidade de elementos com valor
. Vamos brutar todas essas possibilidades:
- Usar só um
:
- Usar dois
e um
, com
e
:
- Usar um
, um
e um
, com
e
:
Complexidade é .
Subtask 4 (full): 
Vamos ordenar o vetor. Agora temos que escolher três posições, vamos fixar a do meio como e dizer que elas são
. Para cada
queremos achar todos os pares
que satisfazem
.
Imagine que fixamos o , e chamamos o valor máximo de
que satisfaz a condição como
. A observação que permite o uso do two pointers é a de que
. A prova é trivial e deixada como exercício para o leitor.
Então, para cada vamos começar com
. Agora, para cada
, começando com
vamos fazer o seguinte loop:
- Enquanto
e
:
Após rodar o loop para cada somamos a resposta
, já que todas as
posições
são
válidos para a nossa equação.
Como para cada fazemos
operações (temos um valor que vai de
até
e outro que vai de
até
), a complexidade final é
.
Dígitos
Escrito por Caique Paiva
Conhecimentos Prévios Necessários:
Vamos definir como para ser o número mínimo de rodadas para ir de
para
. Vamos calcular a dp de forma iterativa, então, quando formos calcular a resposta para
, já temos calculada
com
. Agora, vamos pegar todos os dígitos de
(Para isso, basta fazer um while em que pega o resto de
por
e divide-o por
), e testar subtrair cada um deles, e então,
, onde
é um dígito de
, e tiramos o mínimo pois queremos pegar a menor resposta possível. Depois disso, basta imprimir
.
Clique aqui para ver o código (Fun fact: Esse problema já existia antes da prova)