OBI 2017 - Fase 3 - Programação Nível 2
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.
Para conferir a prova na íntegra, clique aqui.
Taxa
Comentário escrito por Caique Paiva
Conhecimento prévio necessário:
Seja o vetor em que guardamos como vamos dividir o terreno. Vamos fazer uma dp em intervalo para esse problema! Seja dp[
][
] para ser o menor valor para dividir o terreno em
intervalos de tamanho
. Então, primeiro veja que
para todo
, e então, a transição vai ser
Onde e vai até
e
é a soma dos vetores de
até
. Veja que todos essas funções (dp e sum) são cíclicas, então por exemplo, se
, então
e
. No final, basta retornar
para todo
.
Para fazer um vetor circular (como é mostrado no código), a ideia é fazer todas as operações módulo , ou seja, quando fazemos
, se
for ficar negativo, fazemos
.
Clique aqui para conferir o código
Postes
Comentário escrito por Enzo Dantas
Conhecimento prévio necessário:
Devemos contar quantos postes devem ser substituídos e quantos devem ser consertados. Para fazer isso, devemos contar quantos postes tem uma altura menor que 50 e quantos tem uma altura entre 50 e 84 (a partir de 85 ele pode ser usado normalmente). Assim, vamos manter dois contadores: e
. Ao lermos o input, aumentaremos
em 1 toda vez que encontrarmos um número menor que 50 e aumentaremos
em 1 toda vez que encontrarmos um número maior ou igual a 50 e menor que 85.
No fim, printaremos e
.
Clique aqui para conferir o código
Dividindo o Império
Comentário escrito por Arthur Lobo
Conhecimento prévio necessário:
O problema fala que "Alguns pares de cidades estão ligados diretamente por estradas bidirecionais e, por uma antiga tradição, esses pares são escolhidos de maneira que sempre é possível ir de qualquer cidade para qualquer outra cidade por exatamente um caminho (um caminho é uma sequência de estradas).". Isso quer dizer que o grado do problema é uma árvore.
Então, dado uma árvore, o problema pergunta qual a aresta a ser removida tal que o tamanho das 2 árvores geradas após a remoção seja o mais próximo possível.
A ideia aqui vai ser calcular qual é esse valor para cada aresta e pegarmos o mínimo. Para isso, vamos enraizar a árvore em algum vértice, digamos que seja o vértice 1, e definimos tamanho da subárvore que tem
como raiz. Exemplo:
Para calcular o valor de , basta perceber que o tamanho da subárvore de
é o somatório do tamanho da subárvore dos filhos
, então podemos fazer uma
em que calculamos primeiro os
dos filhos de
e depois
.
Perceba que ao deletarmos a aresta entre qualquer vértice e seu pai, o tamanho das duas árvores resultantes serão
e
, então basta fazermos um for e pegarmos o menor valor de
.
Clique aqui para conferir o código
Arranha-céu
Comentário escrito por Caique Paiva
Conhecimento prévio necessário:
Esse problema é uma aplicação simples de BIT. Vamos codar uma BIT de soma, igual a feita na aula colocada no link acima, e nós sabemos que ela responde a query e faz o update em . Além disso, vamos guardar o vetor atual, que guarda a quantidade de pessoas em cada apartamento. Na query, retornamos o valor de
que ele nos dá, e no update, fazemos
com o valor e posição que eles no dá na query, e fazemos
.
Clique aqui para conferir o código
Código
Comentário escrito por Arthur Lobo
Conhecimento prévio necessário:
O problema nos dá uma lista
com 10 caracteres cada e nos pergunta se existe qual é a primeira
que é uma
da contatenação de duas
, com
, ou dizer que não existe nenhum.
*Para uma string , vamos definir
como sendo a
, ou seja, a
de
até
de
. Além disso, vamos usar 0-indexado, ou seja, a
inteira é
.
Parcial 1 (
)
Nossa primeira ideia pode ser, para cada , testar todo par
e ver se existe alguma
de
igual à
. Para cada par, vamos criar uma nova
e ver se
, para
, se algum for, então encontramos o
.
A para cada par , nós checamos em 10 operações (apesar de ser
, 10 é uma constante relativamente alta). Já que existem
pares para cada
, e temos
s, a complexidade final fica
, fazendo na verdade ~
operações, que é o suficiente para essa subtask.
Parcial 2 (Sem restrições adicionais)
Vamos dar uma olhada em uma representação visual de quando é uma
de
, com as posições correspondentes em
e na contatenação sendo iguais.
Basicamente vai existir um tal que
é a contatenação das últimas
posições em
e as primeiras
posições em
.
Para ser mais específico, para que seja uma
, deve existir algum
tal que
- Para algum
,
(primeiras
posições de
e últimas
de
são iguais).
- Para algum
,
(últimas
posições de
e primeiras
de
são iguais).
Agora basta guardarmos num set todos os prefixos das strings que já passamos, e em
todos os sufixos das strings que já passamos.
Agora quando estamos em , basta checarmos se existe algum
tal que
está em
e
está em
. Se existir, então
é a resposta. Por fim, colocamos todos os prefixos de
em
e o mesmo com os sufixos em
.
A complexidade fica .
Clique aqui para conferir o código