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.