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:


// Plantação de Morango - F1PJ - OBI 2016
// Rogério Júnior
// Complexidade: O(1)
#include <cstdio> // scanf e printf
int main(){
// declaro as variáveis que vou usar
int a1, a2, b1, b2;
// leio os valores dos lados dos retângulos
scanf("%d %d %d %d", &a1, &a2, &b1, &b2);
// se o primeiro retângulo tiver a maior área
if(a1*a2>b1*b2){
// imprimo a área do primeiro retângulo
printf("%d\n", a1*a2);
}
// caso contrário
else{
// imprimo a área do segundo retângulo
printf("%d\n", b1*b2);
}
// ao fim do programa, retorno 0
return 0;
}

view raw

morango.cpp

hosted with ❤ by GitHub

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:


// Jogo de par ou ímpar - F1PJ/F1P1 - OBI 2016
// Rogério Júnior
// Complexidade: O(1)
#include <cstdio> // scanf e printf
int main(){
// declaro as variáveis que vou usar
int p, d1, d2;
// leio os valores de p, d1 e d2
scanf("%d %d %d", &p, &d1, &d2);
// se a soma de d1 e d2 for par
if((d1+d2)%2==0){
// então ganhará quem pediu par
// se Alice pediu par
if(p==0){
// então Alice ganha
printf("0\n");
}
// caso Alice não tenha pedido par
else{
// então Bob ganha
printf("1\n");
}
}
// se a soma de d1 e d2 não for par
else{
// então quem pediu ímpar ganha
// se Alice pediu par
if(p==0){
// então Bob ganha
printf("1\n");
}
// se Alice não pediu par
else{
// então Alice ganha
printf("0\n");
}
}
// ao fim do programa, retorno 0
return 0;
}

view raw

jogo.cpp

hosted with ❤ by GitHub

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:


// Lâmpadas - F1PJ/F1P1 - OBI 2016
// Rogério Júnior
// Complexidade: O(n)
#include <cstdio> // scanf e printf
int main(){
// declaro as variáveis que irei usar
int i1=0, i2=0, n;
// leio a quantidade de vezes que aperto um interruptor
scanf("%d",&n);
// para cada vez que apertamos um interruptor
for(int i=0;i<n;i++){
// declaro idx
int idx;
// leio qual interruptor foi apertado e salvo em idx
scanf("%d",&idx);
// se apertei o interruptor 1
if(idx==1){
// troco o estado da lâmpada A
// se ela estava acesa
if(i1==1){
// então a apago
i1=0;
}
// caso contrário, ela estava apagada
else{
// então a acendo
i1=1;
}
}
// caso contrário, apertei o interruptor 2
else{
// troco o estado da lâmpada A
// se ela estava acesa
if(i1==1){
// então a apago
i1=0;
}
// caso contrário, ela estava apagada
else{
// então a acendo
i1=1;
}
// troco o estado da lâmpada B
// se ela estava acesa
if(i2==1){
// então a apago
i2=0;
}
// caso contrário, ela estava apagada
else{
// então a acendo
i2=1;
}
}
}
// por fim, imprimo os estados das lâmpadas
printf("%d\n%d\n",i1,i2);
return 0;
}

view raw

lampadas.cpp

hosted with ❤ by GitHub