TEMA
PROBLEM 1089 - URI Fórum 1.0
Este tema fue resuelto y no puede recibir nuevas respuestas.
-
Gerson Groth respondido 7 years ago
São apenas 2 picos. A onda é circular, portanto os picos são: -41 e 42. Quando vc testa novamente com a primeira entrada, repare que a onda continua a descer, já que estava descendo de 42 para 40, continua até zero, recomeçando o ciclo...
40 -> 0 0 -> -41 -41 -> 0 = (Pico = 1) 0 -> 41 41 -> 42 42 -> 40 = (Pico = 2)
-
Rafael Nicolay respondido 7 years ago
Foi assim que fiz Cristhian. Porém, isso não funciona para entradas do tipo:
4 1 1 1 2 0
Pelo que eu entendi, essa é uma entrada inválida. Mas... fazendo desta forma o resultado seria 1, enquando que pelo que parece, o correto seria 2. Recebi WA, vou pular esse problema.
-
Gerson Groth respondido 7 years ago
Você só precisa contar os picos (superior e inferior). Basta verificar quando muda o sentido da onda (se ela estava descendo e agora subiu, significa que é um pico). Lembre-se que a onda é circular, então o último valor vai "se juntar" com o primeiro. Olha os exemplos de entrada e faça alguns testes a mão que vc irá conseguir identificar o que são picos e poder implementar isso.
-
Tailo Mateus respondido 5 years ago
ricardo, nessa parte do problema responde sua dúvida:
"Um pico em uma forma de onda é um valor de uma amostra que representa um máximo ou mínimo local, ou seja, um ponto de inflexão da forma de onda. A figura abaixo ilustra (a) um exemplo de forma de onda e (b) o loop formado com essa forma de onda, contendo 48 picos."
-
Ricardo Nogueira respondido 5 years ago
olá,
Eu não consigo entender porque o seguinte caso de teste tem o resultado igual a 2: 2 1 -3 0
Agradeço.
-
Rodrigo Correia respondido 5 years ago
Meu código esta dando 30% de erro e não consigo encontrar, alguém pode me ajudar?
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;
public class Main {
public static void main(String [] args) throws IOException { BufferedReader scanf = new BufferedReader( new InputStreamReader(System.in)); int testes = Integer.parseInt(scanf.readLine()); while(testes > 0){ char ini = ' '; char primeiro = ' '; int picos = 0; char comparador = ' '; String entrada [] = scanf.readLine().split(" "); int v [] = new int [entrada.length]; for(int i = 0; i < entrada.length; i++) { v[i] = Integer.parseInt(entrada[i]); } if(v[0] > v[1]) { ini = '>'; primeiro = '>'; picos++; } else { ini = '<'; primeiro = '<'; picos++; } if(testes > 2) { for(int i = 1; i < v.length - 1; i ++) { if(v[i] > v[i + 1]) { comparador = '>'; if(comparador != ini) { ini = comparador; picos++; } } else { comparador = '<'; if(comparador != ini) { ini = comparador; picos++; } } } } if(v[v.length - 1] > v[0]) { comparador = '>'; if(primeiro != comparador) { picos++; } } else { comparador = '<'; if(primeiro != comparador) { picos++; } } System.out.println(picos); testes = Integer.parseInt(scanf.readLine()); } }
}//Fim da classe
-
ahed_alrashaida respondido 5 years ago
Hi my friends I submit my code but I get WA 10% and I don't know where the problem. Can you find me this problem?
Edited: It is not allowed to copy solutions from others users. This is plagiarism.
-
Robson Ribeiro Faxas respondido 6 years ago
Gente, essa entrada tá dando diferente pra mim também, é algum bug do Toolkit? Não vejo explicação... Não encontrei nenhuma outra possibilidade de erro. Mesmo repetindo ou usando qualquer sequencia de teste que postaram no fórum, não encontrei outro erro, mas mesmo assim está me dando wrong answer 10%!! :( Alguém sabe o que há de errado? Obs.: Eu ia usar boolean e acabei não usando, mas a biblioteca continua ali hehe
Solucionado: estava printando 0 picos quando encontrava EOF. Apenas suprimi esse acontecimento e funcionou!
-
Unknown respondido 6 years ago
esse problema pode ter entradas com numeros repetidos ex: 5 1 1 0 1 1 0
-
Naftali de Sousa respondido 6 years ago
Qual o problema do meu código, deu falha para essa seguinte condição '0 2 1 -2 -1 2', era para dar 4, retornou 3. Mas os outros testes que fiz, retornou o resultado esperado.
#include <iostream> using namespace std; int main (){ int n, maior = 0, menor = 0, subindo = 0, descendo = 0, pico = 0, inicio; do{ cin >> n; int vet[n + 1]; if(n > 0){ for(int i = 0; i < n; i++){ cin >> vet[i]; } vet[n] = vet[0]; subindo = 0; descendo = 0; for(int j = 0; j < n + 1; j++){ if( vet[j+1] > vet[j]){ subindo = 1; } if( vet[j+1] < vet[j]){ descendo = 1; } if(descendo == 1 && vet[j+1] > vet[j]){ descendo = 0; subindo = 1; pico++; } else if( subindo == 1 && vet[j+1] < vet[j]){ subindo = 0; descendo = 1; pico++; } } cout << pico <<endl; pico = 0; } }while( n > 0); }
-
Naftali de Sousa respondido 6 years ago
Valeu irmão. Vou tentar aqui, mas é que já estou com uns dias parado nessa questão e agora estagnei. Vou ver o que consigo fazer.
-
Gerson Groth respondido 6 years ago
Eu acredito que a dica do Cristhian é muito útil para resolver esse problema. A minha equipe de maratona havia resolvido utilizando um booleano que indicava se a onda estava subindo ou descendo, e contava como pico se houvesse mudança de direção.
Você precisa sempre lembrar que a onda é cíclica, ou seja, você também precisa testar o último valor com o primeiro, para fechar a onda...
-
Naftali de Sousa respondido 6 years ago
Cara, eu realmente nem sei mais o que fazer, ou como testar para saber se é um pico ou não. Para alguns casos de teste dar errado, para outros dar certo. Se possível, peço sua ajuda com alguma ideia para solução do problema.
Código removido!
-
Gerson Groth respondido 6 years ago
Não sei se entendi direito. Você quer, dado uma entrada n (número de elementos a serem lidos), ler n valores? Se for isso, basta usar um for
int n; int vet[MAX + 5]; //valor máximo que n pode ter mais uma margem por segurança ;) scanf("%d", &n); //lê o valor de n for(int i = 0; i < n; i++){ //for de 0 até n-1 scanf("%d", &vet[i]); //lê cada um dos n valores e armazena no vetor }
Caso tenha entendido errado tua pergunta, fique a vontade para perguntar novamente...
-
Naftali de Sousa respondido 6 years ago
A pergunta pode parecer besta, mas é que eu realmente não sei como fazer. Quero saber como faço para colocar uma quantidade de valores para serem lidos de acordo com o que foi digitado, em C++.
-
Dâmi Henrique respondido 6 years ago
Edmundo, como o enunciado do problema diz: "Um loop musical é um trecho de música que foi composto para repetir continuamente (ou seja, o trecho inicia novamente toda vez que chega ao final), sem que se note descontinuidade."
O 4º pico seria de 450->300 ("fim" ao "começo").
-
Edmundo Rodrigues respondido 6 years ago
Alguém me identifica os 4 picos aqui?
4 300 450 449 450
Só consigo perceber, 450->449->450->300.