TÓPICO

PROBLEM 1430 - URI Fórum 1.0

beecrowd perguntou on jul. 26 2013

URI Online Judge Fórum 1.0

MOD

Este tópico foi resolvido e não pode receber novas respostas.

  • grmachado respondido 8 years ago

    W.A. 10%, mas todos os casos de teste passam. O que está errado!?

    import java.*;
    import java.util.*;
    
    public class Main
    {       
        public static void main(String[] args)
        {
            Map<Character, Integer> notas = new HashMap<Character, Integer>();
            notas.put('W', 64);
            notas.put('H', 32);
            notas.put('Q', 16);
            notas.put('E', 8);
            notas.put('S', 4);
            notas.put('T', 2);
            notas.put('X', 1);
    
            Scanner s = new Scanner(System.in);
            String jingle = s.nextLine();
    
            while (!jingle.equals("*"))
            {
                int compassosCorretos = 0;
                for (int i = 1; i < jingle.length(); i++)
                {
                    int tempoTotal = 0;
                    while (jingle.charAt(i) != '/')
                    {
                        tempoTotal += notas.get(jingle.charAt(i));
                        if (tempoTotal > 64) break;
                        i++;
                    }
                    if (tempoTotal == 64) compassosCorretos++;
                }
                System.out.println(compassosCorretos);
                jingle = s.nextLine();
            }        
        }
    }
  • lud_lud respondido 7 years ago

    Estou recebendo 10% de erro neste código.

    Alguém pode me ajudar a encontrar o erro?

    #include<bits/stdc++.h>
    
    using namespace std;
    
    double calcula(char letra)
    {
        if(letra =='W') return 1.00;
        else if(letra=='H') return 0.5;
        else if(letra=='Q') return 0.25;
        else if(letra=='E') return 0.125;
        else if(letra=='S') return 0.0625;
        else if(letra=='T') return 0.03125;
        else return 0.015625;
    }
    
    int main()
    {
        char letra;
        int certo,j;
        double soma;
        char musica[1000001];
    
        while(gets(musica))
        {
            certo = 0;
            soma = 0;
            if(musica[0]=='*'){break;}
            j = strlen(musica);
    
            for(int i = 0; i<j; i++)
            {
                if(musica[i]=='/'){
                    if(soma ==1.00){
                        certo++;
                        soma = 0;
                    }
                }
                    else {
                    soma += calcula(musica[i]);
                }
            }
    
            cout<<certo<<endl;
            }
    
            return(0);
        }
  • gduarte respondido 8 years ago

    Faz sentido esse seu if ?

    if (tempoTotal > 64) break;

    Fiz um caso que quebra seu algoritmo:

    /WHHH/
    *
    MOD
  • eldsmonteiro respondido 8 years ago

    Kaíque, a dica é, multiplicar todos esses valores por um número tal que o resultado para todos é um número inteiro.

    MOD
  • santunes2 respondido 8 years ago

    Na resolução deste problema me deparei com uma situação bem incomum. Um bug na flag de otimização -O2.

    Peguei as entradas do site IME (http://maratona.ime.usp.br/hist/2009/problemas09.html) e compilei meu código usando a flag e não.

    Quando não usando a flag obtive a resposta correta, e quando usando a flag recebia resposta errada em alguns casos de teste.

    Parece que o bug foi resolvido na versão 4.8.3 do compilador como pode ser visto no link abaixo.

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60766

    Também segue uma discussão no codeforces sobre o assunto.

    http://codeforces.com/blog/entry/11450

    Só queria chamar atenção porque esse tipo de problema poderia afetar diversas submissões dos usuários em outros problemas também.

  • dcpietropaolo respondido 9 years ago

    #include <string.h>
    #include <stdio.h>
    int main (){
        int a, b, c, cn, som=0, co=0;
        char i[1000], aux;
        while (1){
            co=0;
            while (1){
                scanf ("%c", &aux);
                if  (aux=='\n'){
                    break;
                }
                if (aux=='W'){
                    som=som+64;
                }
                if (aux=='E'){
                    som=som+8;
                }
                if (aux=='T'){
                    som=som+2;
                }
                if (aux=='X'){
                    som++;
                }
                if (aux=='S'){
                    som=som+4;
                }
                if (aux=='Q'){
                    som=som+16;
                }
                if (aux=='H'){
                    som=som+32;
                }
                if  (aux=='/'){
                    if (som==64){
                        co++;
                    }
                    som=0;
                } 
                if  (aux=='*'){
                    cn=1;
                    break;
                }
            }
    
            if (cn==1){
                break;
            }
            printf ("%d\n", co);
        }
    
    }

    WA 100%

  • jbsilva respondido on nov. 7 2013

    Na vida real é boa prática evitar problemas como buffer overflow, mas na maratona o melhor mesmo é alocar sempre bastante memória e não se preocupar com esses problemas (usar gets em vez de fgets), porque podemos assumir que o input vai ser bom.

  • alesom respondido on nov. 4 2013

    Pô valeu! Agora passou! o/

  • tiagob.reis respondido on nov. 3 2013

    Muda o 200 do seu

    fgets(s, 200, stdin);

    pra um número um pouco maior que seu código passa :)

  • alesom respondido on nov. 2 2013

    Mas mesmo assim, muito obrigado!

  • alesom respondido on nov. 2 2013

    Mudei, mas não deu certo ainda! Wrong answer. Troquei tudo para inteiro e comparei, mas não deu certo! E tentei fazer também a EPS. Nada não deu certo!

  • tiagob.reis respondido on out. 30 2013

    Sua comparação (soma==1) é problemática. Como soma é um double, podem ocorrer erros de precisão. Reescreva o programa usando apenas inteiros ou considere que soma possa estar dentro de um intervalo (soma-EPS, soma+EPS), em que EPS é um número positivo pequeno.

  • alesom respondido on out. 29 2013

    Está dando Wrong answer com este código, o que pode estar errado? Fiz vários casos de testes todos conferem.

    #include <stdio.h>
    #include <string.h>
    
    int main(){
        char s[201];
        int i, cont, tam;
        double soma, aux;
        fgets(s, 200, stdin);
        while ((s[0])!='*'){
            cont=0;
            tam=strlen(s);
            soma=0;
            aux=0;
            for(i=0;i<tam;i++){
                aux=0;
                soma=0;
                while(s[i]!='/' && i<(tam-1)){
                    switch (s[i]){
                        case 'W':
                            aux=1;
                            break;
                        case 'H':
                            aux=0.5;
                            break;
                        case 'Q':
                            aux=0.25;
                            break;
                        case 'E':
                            aux=0.125;
                            break;
                        case 'S':
                            aux=0.0625;
                            break;
                        case 'T':
                            aux=0.03125;
                            break;
                        case 'X':
                            aux=0.015625;
                            break;
                    }
                    soma=soma+aux;
                    i++;
                }
                if (soma==1){
                    cont++; 
                }
            }
            printf("%d\n", cont);
            cont=0;
            fgets(s, 200, stdin);
        }
        return 0;
    }

    Desde já agradeço!