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.