OBI2012 Caderno de soluções Modalidade Programação Nível 2, Fase 2 12 de maio de 2012 Promoção: Patrocínio:
Olimpíada Brasileira de Informática OBI2012 1 Álbum de fotos Dado um retângulo X Y e dois retângulos X 1 Y 1 e X 2 Y 2, decida se é possível colocar estes dois retângulos no interior do primeiro retângulo, sem sobreposição, possivelmente rotacionados, mas com lados paralelos aos do primeiro retângulo. 1 X, X i 1000 1 Y, Y i 1000 É fácil ver que se existir uma solução, então existe uma solução onde um retângulo contém um canto do retângulo maior e o outro contém o canto oposto. Logo basta testar cada uma das 2 2 = 4 orientações possíveis por sobreposições/pedaços para fora.
Olimpíada Brasileira de Informática OBI2012 2 Soma das casas Dados N inteiros em ordem crescente, determinar quais os dois inteiros A e B cuja soma é K. 2 N 10 5 0 a i 10 9 Para todos i e j, a i < a j se i < j A solução mais simples e que ganhava uma pontuação parcial na questão tem complexidade O(N 2 ) e funciona assim: para cada inteiro da sequência busca linearmente no resto da sequência se existe o outro elemento para que a soma dos dois seja K. Mas essa solução é muito lenta para N = 10 5, pois (10 5 ) 2 = 10 10, o que é muito. A solução esperada era com complexidade O(N) ou O(NlgN). A solução com complexidade linear é da seguinte forma: um apontador é criado para o começo da sequência e outro para o final. Comparações vão então sendo feitas, chamando o índice do elemento indicado pelo primeiro apontador de i e o do segundo de j temos 3 possibilidades: a i + a j < K a i + a j > K a i + a j = K No terceiro caso temos a solução então podemos parar de buscar. No primeiro caso a soma é menor do que K, então precisamos aumentá-la, para isso devemos avançar i, fazendo i = i + 1, pois a i+1 > a i, não faria sentido mexer j já que ele vai no sentido de reduzir a soma. Agora, quando temos o segundo caso devemos mover j, fazendo j = j 1, pois a j 1 < a j. Como cada posição da sequência não é visitada mais do que uma vez, a complexidade dessa solução é O(N). A solução de complexidade O(N lgn) envolve ideia similar à solução quadrática, com uma pequena alteração, ao invés de uma busca linear no vetor é feita uma busca binária, que possui complexidade O(lgN), dessa forma são feitas N buscas binárias, uma para cada posição da sequência e a complexidade final fica O(NlgN).
Olimpíada Brasileira de Informática OBI2012 3 Bomba Dado um grafo orientado G e um conjunto M de arestas de G, devemos nos restringir a passeios orientados em que a 3 a, 6 a,, arestas devem pertencer a M, ao passo que as demais não podem pertencer a M. O problema é calcular distâncias usando esses passeios. O grafo G pode ter até 500 vértices e 2000 arestas. Busca em largura no grafo em 3 camadas, ou, de forma equivalente, 3 rótulos por vértice, em que no primeiro e no segundo se espera uma aresta fora de M e no terceiro uma aresta em M.
Olimpíada Brasileira de Informática OBI2012 4 Banco Um banco possui C caixas que atendem em esquema de fila única, quem chega primeiro é atendido antes. N clientes chegam em sequencia, o i-ésimo cliente chega t i minutos depois da agência abrir e demora a i minutos para ser atendido pelo caixa. Cada caixa só pode atender um cliente por vez. Pede-se quantos clientes demoram mais de 20 minutos para ser atendidos após entrarem na agência. 1 C 10 1 N 1000 1 t i 300 1 a i 10 Para resolver este problema, note que o tempo máximo para alguém ser atendido é de 10300 minutos desde o tempo inicial. Isto acontece quando se tem apenas C = 1 caixas, N = 1000 clientes a serem atendidos, todos chegam com t i = 300 minutos e todos necessitam de a i = 10 minutos para serem atendidos. Sabendo disto, podemos, basicamente, simular todas as ações que ocorrem no banco, minuto a minuto, até que não haja mais clientes no banco. Para resolver isto, usamos uma fila como estrutura de dados para armazenarmos quais os clientes que já estão no banco, mas ainda faltam ser atendidos, a partir do minuto 1. Por fim, também adicionamos vetores para dizer quantos caixas estão livres para, caso estejam livres, peguem o próximo da fila e, do contrário, informe quanto tempo é necessário para terminar de atender ao cliente atual. A complexidade disto é de O(T empot otal C), onde T empot otal é o tempo que você imprimirá como resposta, que será pequeno.