TEMA

PROBLEM 1089 - URI Fórum 1.0

URI Online Judge preguntado 8 years ago

URI Online Judge Fórum 1.0

MOD

Este tema fue resuelto y no puede recibir nuevas respuestas.

  • Ricardo Nogueira respondido 5 years ago

    Somente esse trecho já resolveu minha dúvida.

  • 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 5 years ago

    Solucionado
  • Robson Ribeiro Faxas respondido 6 years ago

    Solucionado
  • 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.