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
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
Visita entre Cidades
Comentário escrito por Enzo Dantas
Conhecimento prévio necessário:
Primeiramente, "os pares de cidades ligados diretamente por uma estrada são escolhidos de forma que sempre é possível ir de qualquer cidade para qualquer outra cidade por um, e somente um, caminho" significa que o grafo dado é uma árvore. Assim, o problema pede a distância entre dois vértices de uma árvore.
Isso pode ser achado usando uma DFS ou BFS: inicializamos a distância do vértice inicial A como 0 (). Quando estamos em um vértice u, dizemos que , sendo o peso da aresta .
A resposta do problema é a distância do vértice final , ou seja, .
Clique aqui para conferir o código
Bits
Comentário escrito por Arthur Lobo
Conhecimento prévio necessário:
O problema nos pede para calcular quantas bitstrings (sequências com 0 e 1) existem com no máximo 1's consecutivos. Problemas de contar quantos de uma coisa existem tem uma boa chance de serem resolvidos usando , e é o caso desse.
A usada para resolver esse problema será quantidade de bitstrings válidas de tamanho com 1's consecutivos no final dela. O caso base da será:
- , para
Normalmente nós tentamos fazer a transição calculando quanto estamos em , que é chamado de , mas para esse problema fica mais simples se considerarmos que já sabemos quando estamos em , e então atualizamos o valor das próximas baseado em . Isso é chamado de .
Basta pensar como o valor de influencia no valor das próximas . Inicialmente sabemos os valores de e os valores de todas as outras começam sendo 0. Vamos usar para calcular , depois usar o de para o de , e assim até o final (para ).
Quando estamos em , com e , vamos fazer as seguintes transições:
- Colocamos na posição , então a bitstring de tamanho vai terminar com zeros .
- Colocamos na posição , então a bitstring de tamanho vai terminar com uns . Nesse caso é preciso tomar cuidado quando .
No final a nossa resposta vai ser a quantidade de bitstrings com qualquer valor entre e uns no final, então ela vai ser . Agora basta colocar um módulo em tudo.
Clique aqui para conferir o código