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;
}#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> amostras;
int N, anterior, proximo, picos;
while(cin >> N){
if(!N) break;
amostras.assign(N, 0);
for(int i = 0; i < N; ++i){
cin >> 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;
}
cout << picos << endl;
}
return 0;
}var input = require('fs').readFileSync('/dev/stdin', 'utf8');
var lines = input.split('\n');
while(lines.length){
let N = parseInt(lines.shift());
if(!N) break;
let amostras = lines.shift().trim().split(" ").map((x) => parseInt(x));
let picos = amostras.filter((atual, i) => {
let anterior = amostras[(i - 1 + N) % N];
let proximo = amostras[(i + 1) % N];
return (atual < anterior && atual < proximo) || (atual > anterior && atual > proximo);
});
console.log(picos.length);
}while True:
try:
N = int(input())
if(N == 0):
break
amostras = [int(x) for x in input().strip().split(' ')]
picos = 0
for i in range(len(amostras)):
anterior = amostras[((i - 1) + N) % N]
proximo = amostras[(i + 1) % N]
if((amostras[i] < anterior and amostras[i] < proximo) or (amostras[i] > anterior and amostras[i] > proximo)):
picos += 1
print(picos)
except EOFError:
breakLast updated
Was this helpful?