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