Skip to content

Latest commit

 

History

History
97 lines (70 loc) · 4.37 KB

p3.md

File metadata and controls

97 lines (70 loc) · 4.37 KB

Prova 3 - Editorial

A - Freela

Esta questão é um knapsack clássico sem alterações, onde a quantidade H de horas que Juliana possui é capacidade da mochila. E os itens são dados com peso T e valor R na entrada.

B - Duerno vs Faria

Esta questão pode ser resolvida com um DFS em um grafo implícito. Neste grafo, o nó é como o tabuleiro está no momento, ou seja, um possível nó seria:

101
010
101

Para representar este nó você pode usar uma string, ou um bitset, ou int. As arestas do grafo são formadas pelos movimentos possíveis para sair de um estado para outro. Cada estado tem 9 arestas, pois todo estado você pode fazer 9 movimentos, que seria clicar em cada um dos quadrados, no tabuleiro 3x3.

Então, para realizar a travessia nesse grafo, para cada casa no tabuleiro você deveria executar o movimento e prosseguir com o DFS. E como o grafo é implícito e você não sabe quantos nós tem a princípio, para marcar quais foram visitados ou não, você pode usar um set que guarda os estados já visitados.

C - A procura de X

Esta questão pode ser solucionada de diversas formas, o importante é a solução ter complexidade O(n log n). Um dos jeitos de resolver ela, é colocar todos os nomes em um set, e utilizar o count do set para saber se o nome está lá ou não.

Outro jeito de resolver é guardar os nomes em um vector<string> e utilizar a função binary_search para saber se o nome está ou não no vector.

D - Planejando as férias

Nesta questão Laura precisa saber o menor caminho para cada cidade, partindo da cidade dela, a cidade 1. Para conseguir isso, você pode utilizar o algoritmo de Dijkstra, sem modificações. Ao final do algoritmo, o array de distâncias vai guardar menor distancia entre 1 e as outras cidades.

Toda cidade que não tiver distância infinita, quer dizer que Laura consegue alcançar. Estas devem ser colocadas em um vector<pair<int, int>>, onde o primeiro elemento do par é a distância e o segundo é o número da cidade. Este vector deve ser ordenado, e após a ordenação você terá as cidades na ordem de visita correta.

E - Debates com qualidade

Esta questão conceitua um tipo de grafo, chamado de grafo bipartido. Um grafo bipartido é onde todo vizinho de um nó tem uma cor oposta a esse nó. Para descobrir se dado um grafo ele é bipartido ou não, você pode utilizar uma variação do BFS. Onde você vai utilizar o array de visitados, não só marcando com 0 para não visita e 1 para visitado, mas com 3 valores possíveis.

  • 0 -> não visitado
  • 1 -> visitado e tem opinião A
  • -1 -> visitado e tem opinião B

Assim, caso um vizinho seu já tenha sido visitado, ou seja, ele é 1 ou -1. Ele deve ter um valor oposto ao seu, caso ele tenha o mesmo valor que o seu, você deve marcar esse grafo como não sendo bipartido.