OBI 2017 - Fase 3 - Programação Nível Junior
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.
Zip
Comentário escrito por Vitor Veiga
Conhecimento prévio necessário:
O problema nos dá quatro valores de cartas. As duas primeiras são de Lia e as duas últimas são de Carolina. Queremos saber quem vai ganhar o jogo, ou se haverá empate, seguindo as seguintes regras para calcular a pontuação de cada uma:
Se , ;
Se , ;
Caso contrário, .
Assim, a estratégia será ler a entrada, calcular a pontuação de cada uma das meninas por meio das regras e analisar quem fez mais pontos. Se elas realizarem a mesma pontuação, retornamos empate.
Clique aqui para conferir o código
Ônibus
Comentário escrito por Estela Baron
Conhecimento prévio necessário:
Nesse problema, temos um conjunto de cidades e várias linhas de ônibus, ou seja, temos a representação de um grafo - os vértices são as cidades e as arestas são as linhas. Além disso, como todas as cidades estão conectadas em uma mesma componente e tem exatamente linhas, podemos dizer que esse grafo é uma árvore. Esse último fato não é muito importante para resolver esse problema, mas pode ser útil para outros.
Observe que o enunciado nos pede a distância entre dois pontos. Uma propriedade interessante de uma árvore (um tipo de grafo) é que existe exatamente um caminho entre dois vértices. Assim, podemos realizar uma busca - no caso a bfs- para encontrar a distância entre as duas cidades. Com esse algoritmo, encontramos o menor percurso, o qual coincide com o caminho que estamos procurando.
Vamos recapitular como funciona esse algoritmo:
- iniciamos com uma fila com os vértices a serem analisados, enquanto a fila não estiver vazia, pegamos o primeiro da fila
- vemos todos os vizinhos dele, se eles já tiverem sido visitados, pulamos para os outros
- caso contrário, definimos a distância do vizinho como sendo a distância da cidade atual + 1 e adicionamos o novo vértice na fila
- quando todos os vértices adjacentes tiverem sido visitados, tiramos o vértice atual da fila e continuamos até não restar mais nenhum
Ao final, teremos calculado a distância de todas as cidades para o vértice . Com isso, basta imprimir a distância de .
Clique aqui para conferir o código
Gomoku
Comentário escrito por Estela Baron
Conhecimento prévio necessário:
Nesse problema, o limite já vem estabelecido e é bem pequeno. Isso nos permite verificar, para toda casa, se ela faz parte de uma coluna, linha ou diagonal vencedora. Para isso, podemos analisar quatro casos:
- se a casa atual é a primeira (esquerda para a direita) de uma linha vencedora: basta ir adicionando +1 no estado que corresponde ao eixo y e vendo se as quatro casas são iguais à atual.
- se a casa atual é a primeira (cima para baixo) de uma coluna: basta ir adicionando +1 no estado que corresponde ao eixo x e vendo se as quatro casas são iguais à atual.
Cuidado para não acessar posições que não existem, por exemplo: . Só precisa analisar a posição se for diferente de zero. Outra coisa é que, desse jeito, conseguimos percorrer todas as linhas e colunas possíveis.
Para as diagonais, temos que analisar dois casos:
- quando é do lado superior da direita para o lado inferior esquerdo: temos que ir adicionando +1 ao x e -1 ao y e ver se as quatro casas são iguais à atual.
- quando é do lado superior esquerdo para o lado inferior direito: temos que ir adicionado +1 ao x e +1 ao y e ver se as quatro casas são iguais à atual.
Iniciamos a resposta como . Se as cinco posições, em algum caso, forem iguais, mudamos a resposta para a cor da pedra, 1 ou 2. Por fim, imprimimos a resposta.
Clique aqui para conferir o código