Comentário NOIC OBI 2016 – Fase 1 – Programação Nível Júnior

Comentário por Rogério Júnior

Para ver o caderno de tarefas da primeira fase da Programação Nível Júnior da OBI 2016, clique aqui.

Plantação de morango

Conhecimento prévio necessário:

  1. Entrada e saída (Aula 1)
  2. Estruturas condicionais (Aula 2)

A entrada nos fornecerá os lados de dois retângulos, e pergunta qual dos dois tem a maior área. Vamos ler o comprimento e a largura do primeiro retângulo e salvar nos inteiros a1 e a2, respectivamente. Depois, iremos ler o comprimento e a largura do segundo retângulo e iremos salvar nos inteiros b1 e b2, respectivamente.

A área do primeiro retângulo é a1*a2, enquanto a área do segundo é b1*b2. Desse modo, se a área do primeiro for maior que a do segundo (“if(a1*a2>b1*b2)“) imprimimos o valor da área do primeiro (“printf(“%d\n”, a1*a2);“). Caso contrário (“else“) imprimo a área do segundo (“printf(“%d\n”, b1*b2);“).

Segue o código para melhor entendimento:

https://gist.github.com/rogerioagjr/307b377206c0f5a326b66bcf55b67c2a

Jogo de par ou ímpar

Conhecimento prévio necessário:

  1. Entrada e saída (Aula 1)
  2. Estruturas condicionais (Aula 2)

Vamos salvar os números fornecidos na entrada nos inteiros pd1d2. Temos duas possibilidades: ou a soma dos números é par, ou é ímpar. Para que ela seja par, ela precisa deixar resto $$0$$ na divisão por dois. O operador de C++ que retorna resto na divisão é o %, ou seja (d1+d2)%2, retorna o resto da soma (d1+d2) na divisão por $$2$$.

Se a soma dos números for par, ou seja, deixa $$0$$ na divisão por $$2$$ (“if((d1+d2)%2==0)“), então ganha que pediu par. Se for $$0$$ (“if(p==0)“), então Alice pediu par e vai ganhar, e devemos imprimir $$0$$ (“printf(“0\n”);“). Caso seja diferente de $$0$$ (“else“), então Bob pediu par e ele irá ganhar (“printf(“1\n”)“).

Entretanto, caso a soma dos números não deixe resto $$0$$ na divisão por $$2$$ (“else“), então ela é ímpar e ganhará quem pediu ímpar. Se for $$0$$ (“if(p==0)“), então Bob pediu ímpar e vai ganhar, e devemos imprimir $$1$$ (“printf(“1\n”);“). Caso seja diferente de $$0$$ (“else“), então Alice pediu ímpar e ela irá ganhar (“printf(“0\n”)“).

Segue o código para melhor entendimento:

https://gist.github.com/rogerioagjr/34e40ad0c889ceb65121c8bc9fa39935

Lâmpadas

Conhecimento prévio necessário:

  1. Entrada e saída (Aula 1)
  2. Estruturas condicionais (Aula 2)
  3. Estruturas de repetição (Aula 2)

Vamos usar os inteiros l1l2  para representar os estados das duas lâmpadas. Se l1  for $$1$$, então a lâmpada A está acesa. Se l1 for $$0$$, ela está apagada. De maneira análoga, a lâmpada B está acesa se l2  for $$1$$, e estará apagada de ele for $$0$$. Deste modo, como as duas lâmpadas começam apagadas, os dois inteiros começa com valor igual a zero.

Em seguida, vamos ler o valor de n, a quantidade de vezes que vamos apertar algum interruptor. Agora, usaremos um for para lermos cada um dos interruptores apertados. Para isso, vamos declarar o inteiro idx, que irá guardar qual interruptor foi apertado, então leremos o interruptor e guardaremos em idx.

Agora, dependendo de qual interruptor pressionamos, temos duas possibilidades: se for o primeiro interruptor (idx=$$1$$), então trocamos o estado da lâmpada A (se i1 for $$1$$, irá receber $$0$$, e se for $$0$$ receberá $$1$$ (“if(i1==1) i1=1; else i1=0;“)). Se, entretanto, o interruptor pressionado tiver sido o B, então trocamos o estado das duas lâmpadas, da mesma maneira que fizemos com a lâmpada A, no caso anterior.

Por fim, basta imprimirmos o valores em i1  e em i2. Segue o código para melhor entendimento:

https://gist.github.com/rogerioagjr/d24ecf65612c4b20d55860435822e4a5