1089 - Loop Musical

Parece complicado, mas na real é bem simples, somente sendo necessário um pouco de paciência.

Descrição

Solução

Para cada magnitude de uma amostra, para considerarmos elas um pico, basta que ela cumpra uma dessas duas condições:

  • A magnitude seja menor que seus dois vizinhos;

  • A magnitude seja maior que seus dois vizinhos.

Sendo que, como se trata de um loop, o vizinho à esquerda da primeira magnitude é a última e o vizinho à direita da última magnitude é a primeira. Confira a página Deslocar dentro de um intervalo [0, N - 1] para entender melhor porque as operações (i + 1) % N e ((i - 1) + N) % N funcionam para acessarmos os vizinhos da direita e da esquerda respectivamente.

#include <stdio.h>

int main(){
    int amostras[10001];
    int N, anterior, proximo, picos;

    while(scanf("%d", &N)){
        if(!N)  break;

        for(int i = 0; i < N; ++i){
            scanf("%d", &amostras[i]);
        }

        picos = 0;
        for(int i = 0; i < N; ++i){
            anterior = amostras[((i - 1) + N) % N];
            proximo = amostras[(i + 1) % N];

            if((amostras[i] < anterior && amostras[i] < proximo) || (amostras[i] > anterior && amostras[i] > proximo))  ++picos;
        }

        printf("%d\n", picos);
    }

    return 0;
}

Last updated