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;
}

Related Posts:

  • [OBI2012] Vice CampeãoA 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… Read More
  • [OBI2012] ConsecutivosCertamente 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 … Read More
  • [OBI2012] CorridaEsta questão (leia aqui) é facilmente resolvida se pensarmos no problema como uma divisão, onde C é o dividendo, N é o divisor e o resultado pretendid… Read More