sexta-feira, 20 de maio de 2016

[OBI2012] Consecutivos

Certamente a questão Consecutivos foi a mais complicada da primeira fase da OBI 2012, apesar de também não exigir nenhum conteúdo mais avançado. Para resolvê-la basta saber trabalhar bem com as estruturas de repetição.

Na minha solução usei a variável seqMaior para guardar a pontuação da maior sequência e seqAtual para guardar a pontuação da sequência atual que inicia com o valor 1, uma vez que não existe uma sequência de 0 termos. A cada laço do for há uma verificação: se o número lido for igual ao lido anteriormente a pontuação da sequência é incrementada em 1, caso contrário a sequência que estava sendo contada acaba, mas antes de reinicializá-la com 1 precisamos verificar se ela é a maior até agora para atualizar a variável seqMaior. Observe que esta verificação não é feita para o primeiro número lido(i=0).

Código em C++

//CONSECUTIVOS: OBI 2012 F1N1
#include <cstdio>
int main(){
int N,seqAtual=1,seqMaior=1,num,anterior;
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d",&num);
if(i>0){//não verifica para i=0, já que não há um anterior nesse caso
if(anterior == num) seqAtual++;
if(anterior != num || i == N-1){ //verifica se a sequencia acabou ou se é o ultimo numero lido
if(seqAtual > seqMaior) seqMaior = seqAtual;
seqAtual = 1;
}
}
anterior = num;
}
printf("%d\n",seqMaior);
return 0;
}

quinta-feira, 19 de maio de 2016

[OBI2012] Corrida

Esta questão (leia aqui) é facilmente resolvida se pensarmos no problema como uma divisão, onde C é o dividendo, N é o divisor e o resultado pretendido é o resto.

Leonardo, ao percorrer C metros, fará o circuito da pista completamente X vezes, sendo que o ponto de parada da sua última volta será determinado pela distância que resta correr após as X voltas, ou seja, CXN, observe que isso é exatamente o resto da divisão de C por N. Portanto, basta imprimir C % M.

Código em C++

//Exercício Corrida OBI 2012 F1N1
#include <cstdio>
int main(){
int C,N;
scanf("%d %d",&C,&N);
printf("%d\n",C%N);
return 0;
}
view raw corrida.cpp hosted with ❤ by GitHub

terça-feira, 17 de maio de 2016

[OBI2012] Vice Campeão

A questão, que pode ser lida aqui, é uma questão simples da primeira fase da OBI 2012 que pede, em outras palavras, o segundo maior valor entre três números.

A solução que pensei foi ordenar os três inteiros em ordem crescente e imprimir o número do meio(ou o segundo maior).

Código em C++

#include <cstdio> //scanf,prinft
#include <algorithm> //swap
using namespace std; //com o namespace não é necessário utilizar o "std::" em "std::swap"
int main(){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
//ordena a sequência {a,b,c} em ordem crescente
//a função swap troca os valores entre duas variáveis
if(a < b) swap(a,b);
if(b < c) swap(b,c);
if(a < b) swap(a,b);
//com a sequência ordenanda, b é o do meio ou o vice
printf("%d",b);
return 0;
}
view raw vice.cpp hosted with ❤ by GitHub
Vale lembrar que existem várias outras abordagens possíveis para resolver esse problema.