Festa de Aniversário
Solução escrita por Malu Azevedo
Conhecimentos necessários:
O problema nos pede para determinar quem comemora aniversário primeiro no ano, dadas as datas de aniversário de Alice ($$DA, MA$$) e de Bruno ($$DB, MB$$), imprimindo “$$A$$” se Alice festejar primeiro ou “$$B$$” se Bruno festejar primeiro.
Ideia Central
Para descobrir quem faz aniversário primeiro ao longo do ano, precisamos comparar as duas datas observando a hierarquia do calendário, em que o mês possui prioridade sobre o dia. Se o mês do aniversário de Alice () for diferente do mês de Bruno ($$MB$$), a pessoa com o menor mês comemora primeiro, pois um mês menor vem antes no ano. Caso os dois façam aniversário no mesmo mês ($$MA = MB$$), o desempate é feito pelo dia, significando que a pessoa com o menor dia ($$DA$$ ou $$DB$$) comemora primeiro.
Abordagem Completa
Lemos os quatro inteiros de entrada e aplicamos a lógica condicional direta: se $$MA \lt MB$$, Alice faz aniversário antes. Se $$MB \lt MA$$, Bruno faz aniversário antes. Caso os meses sejam iguais, comparamos os dias: se $$DA \lt DB$$, Alice vem primeiro. Caso contrário, Bruno vem primeiro. A complexidade é $$O(1)$$ por conta que são realizadas apenas comparações diretas entre valores numéricos.
Clique aqui para ver o código completo.
Passes
Solução Escrita por Márcio Vitor
Conhecimentos necessários:
Subtarefa 2 ($$N = 3$$) (20 pontos):
Nessa subtarefa basta verificar se ocorreram passes entre o jogador $$1 e 2$$ e entre os jogadores $$2 e 3$$, mantendo também duas variáveis $$time1, time2$$ que guardam as quantidades de passes para cada time.
Como $$N$$ é bem pequeno é possível resolver usando várias condicionais, caso o aluno não saiba usar loops
Subtarefa 3 (todos os valores de $$J_i$$ são positivos) (20 pontos):
como a todo momento o time $$1$$ é necessário verificar apenas se há uma mudança de jogador entre dois tempos consecutivos. Para isso itere $$i$$ indo de $$2$$ a $$N$$ e verifique se $$J_i \neq J_{i-1}$$ então incremente a variável $$time1$$.
Sem restrições adicionais (100 pontos):
Vamos iterar da mesma forma que a subtarefa $$3$$ porém para para verificar se um passe ocorreu além da mudança de jogadores entre $$i$$ e $$i-1$$ é também necessário verificar se ambos são do mesmo time ou seja se $$J_i$$ e $$J_{i-1}$$ tem mesmo sinal.
nota: uma forma fácil de verificar se dois números $$X,Y$$ têm mesmo sinal é se $$X \cdot Y > 0$$(pelas regras de sinal da multiplicação), para mais detalhes consulte o código abaixo.
Clique aqui para ver o código completo.
Cinema à Distância
Solução escrita por Levi Oliveira
Conhecimentos necessários:
De forma resumida, o problema consiste em encontrar a sessão mais próxima disponível que ainda tenha espaço para cada pessoa. Note que uma pessoa que comprou o ingresso no instante $$T[i]$$ pode assistir a uma sessão $$j$$ somente se $$H[j] \ge T[i]$$. Além disso, cada sessão possui capacidade máxima $$C$$.
Os arrays estão ordenados de forma não decrescente, o que permite que utilizemos a técnica chamada Two Pointers. Assim, vamos percorrer as sessões na ordem em que elas acontecem e manter um ponteiro $$i$$ indicando a primeira pessoa que ainda não foi alocada. Para cada sessão $$j$$, tentamos colocar nela o maior número possível de pessoas, sempre respeitando a capacidade da sessão e o horário de compra do ingresso – com um contador que nos diz quantas pessoas já alocamos na sessão atual.
Considere a sessão $$j$$, com horário $$H[j]$$. Se $$H[j] \ge T[i]$$ e a sessão ainda possui espaço, podemos alocar a pessoa $$i$$ nessa sessão e avançar para a próxima pessoa. Caso contrário, avançamos para a próxima sessão. Se $$T[i] > H[j]$$, como os tempos $$T$$ estão ordenados de forma não decrescente, toda pessoa $$k > i$$ possui $$T[k] \ge T[i] > H[j]$$ e, portanto, também não pode entrar nessa sessão. Se a sessão já estiver cheia, também precisamos avançar, pois não há mais vagas disponíveis. Dessa forma, ao percorrer as pessoas e as sessões em ordem, cada pessoa é alocada na primeira sessão possível, conforme exige o enunciado.
