Comentário NOIC OBI 2023 - Fase 1 - Programação Nível Junior

OBI 2023 - Fase 1 - Programação Nível Junior

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.

Chinelos

Comentário escrito por Estela Baron

Conhecimento prévio necessário:

Depois de ler o valor de N, vamos criar um vetor com pelo menos N+1 posições - para representar a quantidade de chinelos de cada tamanho. Em seguida, é necessário utilizar um for para iterar por todos os tamanhos e ler o valor que representa a quantidade.

Após isso, o programa tem que ler o valor de P. Vamos primeiro criar uma variável de resposta para guardar quantos chinelos foram vendidos. Para percorrer os pedidos, utilizamos mais um loop de for. A cada pedido, temos que verificar se a quantidade de chinelos no estoque é maior que zero. Se for, adicionamos mais um em nossa resposta e subtraímos uma unidade do estoque daquele tamanho, ou seja, estoque[p_i]--;. Caso não a quantidade não for maior que zero, não fazemos nada.

Ao final, basta imprimir a resposta.

Clique aqui para conferir o código.

Epidemia

Comentário escrito por Arthur Lobo

Conhecimento prévio necessário:

Vamos analisar o exemplo que o enunciado nós dá: Se começamos com 3 infectados e o fator reprodutivo é 2, ou seja, N = 3 e R = 2, os próximos dias seriam assim:

  • Dia 1: 3 infectados no dia anterior, então temos 6 novos infectados. Quantidade total de infectados: 3+6 = 9.
  • Dia 2: 6 infectados no dia anterior, então temos 12 novos infectados. Quantidade total de infectados: 9+12 = 21.
  • Dia 3: 12 infectados no dia anterior, então temos 24 novos infectados. Quantidade total de infectados: 21+24 = 45.
  • ...

Perceba que a quantidade de novos infectados em um dia depende apenas da quantidade de novos infectados no dia anterior, então podemos ir testando quantos infectados vão ter em cada dia, mantendo a quantidade de novos, e parar quando essa quantidade for maior ou igual a P.

Para isso, vamos manter duas variáveis: 'infectados_totais', que começa sendo N, e 'infectados_novos', que também começa sendo N.

Em seguida, fazemos um for de 1 até P (podemos ir só até P porque sabemos que não vão se passar mais de P dias até acabar). Dentro do for, vamos aumentar a quantidade total de infectados na quantidade de infectados no dia anterior vezes P ( 'infectados_totais+= infectados_novos*P', e mudar a quantidade de 'infectados novos ('infectados_novos = infectados_novos*P'). Agora basta checar se a quantidade total de infectados passou de P ('infectados_totais >= P'), se sim, imprimimos i e terminamos o código fazendo 'return 0'.

Vale ressaltar que também temos que checar se a quantidade inicial já que maior do que P. Se for, imprimimos 0.

Clique aqui para conferir o código

Prêmio

Comentário escrito por Estela Baron

Conhecimento prévio necessário:

Nesse problema, para obter a soma dos pontos, basta multiplicar a quantidade de pães por 1, de doces por 2 e de bolos por 3. Depois de ter salvado esse resultado, verificamos se a soma é maior ou igual a 150 - se for, imprimimos 'B' pulando uma linha '\n'-, ou se é maior ou igual a 120, ou 100, ou nada (imprimindo a letra de cada caso). Como esse problema trabalha com o básico da programação, é válido listar algumas observações:

  • Em seu código, você começa declarando a biblioteca e a função int\; main(). Dentro das chaves ({}) dessa função, o código deve ser escrito.
  • Como a nossa entrada não é fixa, ou seja, não sabemos exatamente os valores de P, D\; e\; B, é necessário obter as informações a partir da entrada. Para isso, vamos ter que ler a entrada e atribuir cada informação a uma variável - para podermos utilizar posteriormente. Isso é feito com o comando cin >> ou scanf(). Por exemplo, se colocarmos cin\; >> \; a;, queremos dizer que o primeiro valor na entrada vai ser atribuído a uma variável cujo nome é a - desde que esta seja declarada antes.
  • A multiplicação em C++ é realizada a partir do asterisco (*). Suponha que temos uma variável do tipo inteiro para guardar a soma inicialmente com o valor 0: int\;soma = 0;. Se quisermos adicionar 9, podemos fazer assim: soma\; = \; soma + 3*3;. Com isso, soma tem valor 9;
  • Para conferir se o total de pontos está entre algum intervalos, podemos utilizar as estruturas condicionais para verificar cada critério. Vale ressaltar a importância de utilizar else\; if no decorrer do código, pois um mesmo valor pode se encaixar em dois critérios: 160 é maior que 150, mas também é maior que 120. Então se não houver uma hierarquia, podemos acabar contando duas vezes. Por isso, o else \;if é importante, pois, quando uma condição é cumprida, o programa nem considera as outras.
  • Por último, precisamos imprimir a nossa resposta. Podemos utilizar o comando cout\; << ou printf(). Como estamos imprimindo letras, precisamos colocar entre aspas a letra e pular um linha ( '\n').

Para conferir o código, clique aqui.