Comentário NOIC OBI 2021 – Fase 2 Turno A – Programação Nível 1

OBI 2021 – Fase 2 Turno A – Programação Nível 1

Para se preparar para a OBI, confira o nosso Roteiro de Estudos, nele você vai encontrar um direcionamento completo de como estudar!

Comentário escrito por Pedro Racchetti, Lúcio Figueiredo, Luca Dantas e Thiago Mota

Para conferir a prova na íntegra, clique aqui.

Duplas de Tênis

Conhecimento prévio necessário:

Primeiro, para simplificar a solução, chamaremos os jogadores de $$A$$, $$B$$, $$C$$ e $$D$$. Para este problema, nota-se que só temos 3 configurações possíveis de duplas:

  • $$(A,B)$$ e $$(C,D)$$;
  • $$(A,C)$$ e $$(B,D)$$;
  • $$(A,D)$$ e $$(B,C)$$.

Portanto, basta testar a diferença dos valores para cada configuração, e imprimir a menor delas.

A complexidade da solução é $$O(1)$$. Segue o código, comentado, para melhor compreensão:

Retângulo

Conhecimento prévio necessário:

Para resolver o problema, vamos utilizar a seguinte observação:

Observação: Um quadrilátero $$ABCD$$ demarcado em um círculo é um retângulo se e somente se as diagonais $$AC$$ e $$BD$$ são diâmetros do círculo.

Com esta observação, basta sabermos se existem quatro pontos $$A < B < C < D$$ no círculo tais que os segmentos $$AC$$ e $$BD$$ são diâmetros, ou seja, a soma dos arcos de $$A$$ a $$C$$ e a soma dos arcos de $$B$$ a $$D$$ ambas valem metade da circunferência do círculo.

Defina $$S(i, j)$$ como a soma dos arcos entre os pontos $$i$$ e $$j$$ $$(i < j)$$, ou seja, $$L_{i+1} + L_{i+2} + … + L_j$$. Além disso, defina $$D(i)$$ como o ponto $$j$$ tal que o segmento $$ij$$ é um diâmetro, ou $$-1$$ caso não exista. Vamos computar, para cada ponto $$i$$, o seu valor $$D(i)$$. Pela definição de diâmetro, teremos que $$ij$$ é um diâmetro se e somente se $$S(i, j)$$ vale metade da circunferência, ou seja, $$\frac{S(0, n)}{2}$$. Portanto, para encontrar o ponto $$j$$ (se existir), podemos utilizar uma busca binária no intervalo $$[i+1, n]$$. Para calcularmos os valores $$S(i, j)$$ de forma eficiente, basta precalcularmos a soma de prefixo do vetor $$L$$; assim, se $$P_x$$ é a soma do $$x$$-ésimo prefixo, conseguimos calcular $$S(i, j)$$ em $$O(1)$$, já que $$S(i, j) = P_{j} – P_{i-1}$$.

Após computarmos os valores $$D(i)$$, resta apenas checar se existem dois pontos $$A$$ e $$B$$ tais que $$D(A) \neq -1$$ e $$D(B) \neq -1$$. Se sim, existe um retângulo demarcado no círculo formado por $$A, B, D(A)$$ e $$D(B)$$. Senão, não existe retângulo algum.

Já que realizamos uma busca binária para cada um dos $$N$$ pontos, a complexidade da solução é $$O(N \cdot \log_{} N)$$. Confira o código abaixo para melhor entendimento:

PS.: Existe uma solução com complexidade $$O(N)$$, utilizando a técnica de Two Pointers para encontrar os valores $$D(i)$$. Como exercício, tente implementar esta solução!

Robô

Conhecimento prévio necessário:

Neste problema, precisamos apenas simular a ação do robô, adicionando um valor à resposta a cada vez que ele passar pela estação desejada.

Para simular o movimento, basta andarmos na direção que a entrada do problema nos indica (1 anda para a direita, -1 anda para esquerda). Para manter a propriedade circular, podemos utilizar uma de duas técnicas: na primeira, utilizaremos um if para checar se uma posição é menor que $$1$$ ou maior que $$n$$, e assim atribuí-la para o valor correto do outro lado do círculo (se for $$0$$ vira $$n$$, se for $$n+1$$ vira $$1$$). A outra possibilidade é salvar os valores $$0$$-indexados (de $$0$$ a $$n-1$$) e utilizar o operador de módulo para atribuir o valor correto.

A complexidade da solução é $$O(C)$$. Para melhor entendimento, confira os códigos abaixo, que implementam as duas maneiras de resolver o problema, mencionadas acima:

Solução 1, utilizando if

Solução 2, utilizando módulo

Média e Mediana

Conhecimento prévio necessário:

Para que a média seja igual a mediana, basta que a distância do elemento do meio para as pontas seja a mesma, por exemplo: $$2$$ $$5$$ $$7$$, a distância do $$5$$ para as pontas é a mesma, logo a média e a mediana ficam no mesmo ponto. Podemos demonstrar isso matematicamente:

Demonstração

Pegue 3 números em ordem não-decrescente $$a, b, c$$, onde $$b$$ é a mediana. Para que a média seja igual a mediana precisamos é necessário que $$\frac{a+b+c}{3} = b$$. Logo podemos abrir a conta e chegar na conclusão apresentada acima.

$$ \frac{a+b+c}{3} = b $$
$$ a+b+c = 3b $$
$$ ac = 2b $$
$$ c-b = b-a $$

[collapse]

Para resolver o problema, basta escolher qualquer número de tal forma que a diferença entre o maior e o menor seja igual o do meio. Segue o código: