Programação Nível 1

Receita Revolucionária

Solução escrita por Levi Oliveira

Conhecimentos necessários:

Seja $$P$$ quantidade de pães e $$O$$ a quantidade de ovos. Por dia, Murilo come exatamente $$2$$ pães e $$4$$ ovos. 

Se ele só comesse pães, a quantidade de cafés da manhã que ele conseguiria fazer seria $$\left\lfloor \frac{P}{2} \right\rfloor$$.

Se ele só comesse ovos, a quantidade de cafés da manhã que ele conseguiria fazer seria $$\left\lfloor \frac{O}{4} \right\rfloor$$.

Como em um café da manhã completo ele precisa comer pães e ovos, a resposta será o mínimo entre $$\left\lfloor \frac{P}{2} \right\rfloor$$ e $$\left\lfloor \frac{O}{4}\right\rfloor$$. Para computar esse valor, podemos ou usar a função $$min(a, b)$$ da biblioteca <algorithm>, a qual compara dois valores e retorna o menor deles, ou guardar dois valores em variáveis auxiliares e imprimir o menor usando ifs.

Clique aqui para ver o código completo.

Encontro de Amigas

Solução escrita por Márcio Vitor

Conhecimentos necessários:

Subtarefa 2 – ($$A_1 = A_2$$):

Perceba que a resposta é no máximo 1 pois Ana permanecera apenas 1 dia no Brasil, então basta checar se esse dia esta dentro dos outros dois intervalos de tempo, se sim retorne 1, caso contrario retorne 0.

Para verificar se um tempo x esta dentro de um intervalo $$[L,R]$$ basta checar se $$x >= L$$ e $$x <= R$$.

Subtarefa 3 – (sem restrições adicionais):

Usando as ideias da subtarefa 2, vamos manter um contador $$cnt$$, e iremos iterar pelos possíveis dias $$D$$ de 1 a 31 e ver se ele esta dentro de todos os intervalos que as garotas estarão no Brasil, se sim adicionamos 1, ao final de tudo $$cnt$$ será a resposta.

Clique aqui para ver o código completo.

Mercadinho

Solução escrita por Malu Azevedo

Conhecimentos necessários:

O problema nos pede o menor tempo em segundos para que todos os idosos (idade60idade\geq60) fiquem no início da fila. A cada segundo, múltiplos idosos podem dar um passo à frente simultaneamente, desde que ultrapassem uma pessoa jovem (idade<60idade < 60).

Ideia Central

A observação crucial para resolver este problema de forma ótima é notar que um idoso nunca é atrasado por outro idoso de modo a gastar segundos adicionais.

Como todos os idosos elegíveis se movem ao mesmo tempo, se houver um bloco de idosos juntos, eles se deslocam para a frente em “bloco” assim que o primeiro idoso desse grupo encontrar e ultrapassar um jovem. Portanto, o tempo que um idoso leva para chegar à sua posição final depende única e exclusivamente da quantidade de jovens que estão inicialmente à sua frente.

Se um idoso possui J jovens à sua esquerda na fila original, ele precisará de exatamente J segundos para ultrapassar todos eles.

Como todos os movimentos ocorrem em paralelo, o tempo total necessário para organizar toda a fila será determinado pelo idoso que estiver na pior situação possível. Logo, a resposta é o máximo de jovens à frente de qualquer idoso. Caso não haja nenhum idoso na fila, a resposta é 0.

Subtarefa 2 – N1000N\leq1000 (40 pontos)

Com um limite de NN pequeno, uma solução que simule o processo segundo por segundo (realizando as trocas no vetor manualmente até que nenhum idoso precise se mover) é aceitável. Uma simulação direta custaria no máximo O(N2)O(N^2) operações, o que roda tranquilamente dentro do tempo para N=1000N=1000.

Subtarefa 3 – Existe um único idoso na fila (20 pontos)

Como há apenas um idoso, basta percorrer a fila até encontrá-lo. Todas as pessoas antes dele serão obrigatoriamente jovens. Portanto, a resposta é simplesmente o número de elementos avaliados antes de achar o idoso (o seu índice 0-indexado). Resultando em uma complexidade O(N)O(N)

Subtarefa 4 – Nenhuma restrição adicional (N105N \leq 10^5)(40 pontos)

Para garantir os 100 pontos, precisamos de uma abordagem linear O(N)O(N). Utilizando a nossa ideia central, podemos resolver o problema em uma única passada pelo vetor:

Mantemos um contador jovens=0 e uma variável tempomax=0.

Percorremos a fila do início ao fim:

  • Se a pessoa atual for jovem, incrementamos jovens.
  • Se a pessoa atual for idosa, ela precisará passar por todos os jovens acumulados até ali. Atualizamos tempomax = max(tempomax, jovens).

Ao final da leitura, tempomax terá a resposta correta.

Clique aqui para ver o código completo.