OBOI 2023 - Fase 2 - Nível Júnior
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.
Par de Palitinhos
Comentário escrito por Estela Baron
Conhecimento prévio necessário:
Como o problema nos garante que os palitinhos estão em ordem crescente, podemos armazenar qual era o tamanho do palito anterior e calcular a diferença entre o palito atual com o anterior. Veja que a menor diferença entre um palito é, ou o palito seguinte, ou o anterior. Caso a diferença calculada seja menor que o menor valor que achamos anteriormente, atualizamos a resposta. Observe também que só podemos calcular a diferença do anterior a partir do segundo palito. Ao final, basta imprimir a resposta.
Clique aqui para conferir o código.
Cifra
Comentário escrito por João Pedro Castro
Conhecimento prévio necessário:
Vamos denotar o i-ésimo caractere de uma string como (0-indexado). A ideia da solução é simplesmente checar se a "distância" entre todos os pares de caracteres e são a mesma para todo . Para realizar isso, podemos simplesmente guardar a distância entre os primeiros caracteres de ambas strings, e , e depois adicionar essa distância à todo e confirmar se após isso ele é o mesmo caractere que .
Para não termos distâncias negativas, se dizemos que e que simultaneamente (ou seja, trocamos elas de lugar); e para somar essa distância nos podemos transformar eles em valores númericos entre e fazendo , e então somar a esse valor a distância , e depois pegar o módulo disso, para que caso passe da letra Z ele volte para o A. Logo, o caractere após a soma vai ser , e se esse valor for igual a para todo , a resposta é 'S', caso contrário a resposta é 'N'.
Clique aqui para conferir o código
Entrega de Mantimentos
Comentário escrito por Enzo Dantas
Conhecimento prévio necessário:
Subtask 1
Para os limites pequenos, podemos calcular em O(N) a resposta para cada coordenada entre (0,0) e (100,100).
Solução completa
Intuitivamente, imaginamos um ponto no plano e qual seria a resposta para ele. Deslizando esse ponto livremente, chegamos a primeira observação: se movermos um ponto para a esquerda/direita, as distâncias verticais não mudam, apenas as horizontais (a situação análoga acontece ao deslizar o ponto para cima/baixo). Logo, é possível calcular as coordenadas X e Y independentemente.
Assim, o problema foi reduzido para o seguinte: dados vários pontos numa linha, retorne um ponto qualquer que minimiza o somatório das distâncias aos outros pontos. Seguindo a idea de imaginar um ponto e deslizá-lo pelo plano, percebemos o seguinte: quando o deslizamos 1 unidade para a direita, por exemplo, o somatório aumenta em 1 para cada ponto a sua esquerda e diminui em 1 para cada ponto a sua direita. Assim, se há mais pontos a direita, vale a pena deslizar para a direita e vice-versa. Logo, o ponto ótimo fica em uma posição tal que há metade dos pontos a sua esquerda e metade a sua direita (ou seja, a mediana), pois qualquer movimentação dele diminuiria ou não mudaria o somatório. Para o caso em que N é par, os dois pontos centrais são ótimos. Como o enunciado pede para maximizar o X em caso de empate, retornamos o mais a direita.
Logo, a solução final consiste em separar as coordenadas X e Y em dois arrays diferentes, ordená-los, e retornar as duas medianas.
Clique aqui para conferir o código
Tomando Almas
Comentário escrito por Estela Baron
Conhecimento prévio necessário:
Parcial:
Vamos chamar de a quantidade de exercícios do tipo A. Podemos testar para todos os valores de de 0 até k qual é a quantidade de instrutores que podem ser impressionados com exercícios do tipo A e exercícios do tipo B. Assim, guardamos a maior quantidade. Para isso, para cada , vamos verificar se a pessoa tem menor ou igual a ou menor ou igual a . A complexidade fica .
Solução total:
Vamos chamar de a quantidade de exercícios do tipo A. Observe que podemos enxergar isso como uma soma de prefixos: é possível impressionar o se for maior ou igual a ou se for maior ou igual a . Ou seja, podemos escolher o para intervalos de até - quando impressionamos pelo valor de . Também conseguimos escolher o para intervalos de de até - quando conseguimos impressionar pelo valor de .
No entanto, é possível que, para determinado valor de , tanto quanto sejam contados. Com isso teríamos uma contagem repetida. Por isso, precisamos retirar os intervalos em que as duas condições são atendidas. Observe que, quando escolhemos usar o , ficamos com exercícios para . Logo, essa diferença equivale ao valor máximo de que podemos escolher de tal forma que dê para cumprir tanto quanto .
Logo, a nossa soma de prefixos será calculada da seguinte forma: só iremos colocar as posições que nos interessam (para não estourar a memória e o tempo). Vamos adicionar +1 em cada . Se não ultrapassar , vamos adicionar +1 no valor e -1 no valor . Com a soma acumulada, teremos a soma de pessoas. Para tirar as pessoas que contamos duas vezes, vamos adicionar -1 em e adicionar +1 em . Lembrando que só será preciso tirar os valores repetidos se forem menores ou igual a .
Para fazer a soma acumulada, foi utilizado um vector e, em seguida, ele foi ordenado. Então a complexidade ficou .
Ao final, fazemos a soma acumulada e guardamos a maior resposta.