OBI 2022 - Fase 2 - 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.
Troféu
Escrito por Vitor Veiga
Conhecimento prévio necessário:
Dadas cinco pontuações em uma competição, queremos saber o número de competidores empatados com a maior pontuação e com a segunda maior pontuação. Assim, teremos que achar o valor dessas duas pontuações, utilizando um loop, e depois checar quantos participantes obtiveram cada uma delas.
Ordenando o vetor dos valores em ordem decrescente, a primeira posição será o maior número, e o segundo maior será o primeiro número do vetor diferente do maior. Basta agora contar quantas vezes esses valores se repetem utilizando um simples loop, e depois retornar essas quantidades.
Confira o código.
Câmeras
Escrito por Enzo Dantas
Conhecimento prévio necessário:
Primeiramente, iremos construir a matriz e marcar quais posições são vigiadas por câmeras e quais estão livres. Se uma câmera posicionada em
está apontada para o Oeste, por exemplo, vamos marcar todas as posições a direita de
como vigiadas (todas as posições
). Em seguida, vamos fazer uma DFS começando do
e vamos conferir se a DFS chega na posição
.
Confira o código
Subcadeias
Escrito por Caique Paiva
Conteúdo Prévio Necessário:
Primeiro perceba que é bem pequeno, então uma solução
passa bem perto do limite. Com um código bem feito, é possivel que passe. Vou fazer uma solução
por ser mais rápido.
A parte mais importante do problema são esses dois pontos
- Se um intervalo
é um palindromo, então
também é.
- Se um intervalo
não é palindromo, então
também não é.
Com isso, vamos fazer o seguinte algoritmo:
Vamos começar com o intervalo . Obviamente ele é palindromo.
- Passo
: Sabemos que
é palindromo. Se
, então
é palindromo. Se
, então,
não é palindromo, e então a gente para o algoritmo, retornando
Roda isso pra todo de
até
, e sempre salvamos o máximo que esse algoritmo entrega como valor, e então conseguimos o maior palindromo de tamanho ímpar. Para os palíndromos de tamanho par, ao invés de começarmos com
, basta ver se
, e se for verdade, rode o algoritmo começando com
.
Viagem
Escrito por Arthur Lobo
Conhecimento prévio necessário:
- Menor Caminho
Nós temos que levar em conta o tempo e o valor, então vamos criar um novo grafo em que os vértices serão representados por um par . Queremos saber qual o menor tempo gasto para chegar em cada
gastando exatamente
.
Se existe uma rota da ilha para
com tempo
e custo
, então no nosso grafo, nós vamos adicionar uma aresta de
para
com custo
, para todo
. Ou seja, se conseguimos chegar em
gastando
em
unidades de tempo, então podemos chegar em
gastando
em
unidades de tempo.
Com esse novo grafo montado, agora basta utilizarmos o algoritmo de Dijkstra nele, ou seja, vai guardar o menor tempo possível para chegarmos na ilha
gastando exatamente
. Para isso, começaremos
e todos os outros com
, e agora rodamos Dijkstra normal, com a única diferença que os vértices são identificados por pares de números, e não apenas um número.
É fácil ver que a resposta do problema vai ser .
A complexidade final fica , clique aqui para ver o código.