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)