Solução Informática – Nível Intermediário – Semana 20

por

Solução por Anita Ramos

Esse é um típico problema em que é necessário ter uma ideia sólida antes de programar e iniciar os testes. Essa ideia é bem simples, mas pode gerar uma certa confusão para conseguir “cobrir” todas as possibilidades.

A ideia consiste em já determinar o número de intervalos de cada número existentes na faixa logo na leitura inicial desta e, posteriormente, a cada pergunta em que $$num=1$$ atualizamos o número de intervalos de cada valor. O primeiro processo citado é simples, bastando comparar o valor da casinha lido com o valor da casinha anterior. O segundo é o que pode gerar uma certa confusão e uma dificuldade em esclarecer as possibilidades e, por isso, irei dividir em 4 opções, sendo que a escolha de uma opção não impede a escolha de outra, ou seja, mais de uma opção pode ser verdadeira, sendo assim, as duas serão executadas em ordem:

  1. Se os dois vizinhos da casinha $$X$$ forem iguais à $$C$$, subtrai-se 1 na quantidade de intervalos de valor igual a $$C$$, pois teremos a união de dois intervalos distintos -> a direita de $$X$$ e a esquerda de $$X$$ (não consideramos o valor da casinha $$X$$, pois ele será analisado depois);
  2. Se os dois vizinhos da casinha $$X$$ forem diferentes de $$C$$, soma-se 1 na quantidade de intervalos de valor igual a $$C$$, pois teremos a criação de um novo intervalo de um número “isolado” (diferente dos vizinhos);
  3. Se os dois vizinhos da casinha $$X$$ têm valores iguais ao valor ATUAL (sem alteração ainda) da casinha $$X$$, soma-se 1 na quantidade de intervalos de valor igual ao valor ATUAL da casinha $$X$$, pois teremos a separação de 1 intervalo em dois intervalos (desconsiderando o novo valor $$C$$ da casinha $$X$$);
  4. Se os dois vizinhos da casinha $$X$$ têm valores diferentes do valor ATUAL (sem alteração ainda) da casinha $$X$$, subtrai-se 1 na quantidade de intervalos de valor igual ao valor ATUAL da casinha $$X$$, pois teremos que o intervalo desse número isolado da casinha $$X$$ sumirá ao trocarmos seu valor.

Assim, o truque está em considerar o que ocorrerá inicialmente (casos 1 e 2 acima) independente do valor ATUAL da casinha $$X$$, pois basta considerar ambos os casos posteriormente (casos 3 e 4). Depois de uma pergunta com $$num=1$$, não podemos esquecer de, ao final, atualizar o valor da casinha $$X$$ ($$v[X] = C$$).

O terceiro e último processo é se $$num=2$$, em que imprimimos o valor de $$marc[C]$$ (número de intervalos da cor/número $$C$$).

Segue o código comentado para melhor compreensão da solução:

https://gist.github.com/anitainfo/e358afc48ada52bb02d500417ef5fd47