TOPIC

PROBLEM 1367 - URI Fórum 1.0

URI Online Judge asked 6 years ago

URI Online Judge Fórum 1.0

MOD

This topic was solved and cannot recieve new replies.

  • Deniskawasaki replied 3 years ago

    InputStreamReader ir = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(ir); String aux = "4"; int total=0; int cont=0; int correct = 0; int bonus=0; int aux1=0; boolean troca = false; for(;;){ int x = Integer.parseInt(in.readLine()); if(x == 0){ break; } total=0; correct=0; bonus=0; aux1=0; for(int i = 0; i < x ; i++){ cont++; String entrada = in.readLine(); String vetor[] = entrada.split(" "); String problema = vetor[0]; int tempo = Integer.parseInt(vetor[1]); String julgamento = vetor[2];

    if(aux.equals(problema)){ if(julgamento.equals("correct")){ correct++; total += tempo; if(troca){ total+=20*aux1; } } else{ aux = problema; aux1++; } } else{ aux1=0; if(julgamento.equals("correct")){ total += tempo; correct++; } else{ aux = problema; troca=true; aux1++; } } } System.out.print(correct + " " + total); System.out.println(""); } }

    }

    Ta dando 40% de wa.. alguem poderia me ajudar pf

  • Mateus Melo replied 3 years ago

    Não entendi direito sua lógica. A questão é um pouco mais simples que isso. Você pode usar o mapa pra contar quantas submissões erradas tiveram e quando vier uma certa, você multiplica o valor do mapa naquela questão por 20 e soma com o tempo daquela questão.

  • Eduardo Correa Encarnação _ C replied 4 years ago

    Pessoal, pq estou recebendo WA 40%? Para quais casos eu estou errando? Testei todos aqui do fórum e funcionaram corretamente.

    #include <iostream>
    #include <utility>
    #include <string>
    #include <map>
    
    using namespace std;
    
    int main() {
    
      int n, i = 0, j, tempo = 0;
      char cAux;
      int iAux;
      string sAux;
    
      while(cin>>n && n!=0) {
    
        map<char, pair<pair<int,int>,string> > sub;
        int a = 0, b= 0;
    
        for(j=0; j<n; j++) {
    
            cin >> cAux >> iAux >> sAux;
            sub[cAux] =  make_pair(make_pair(iAux,0),sAux);
    
            if(sub[cAux].second.compare("correct")==0) {
                b = (a * 20);
                tempo+=sub[cAux].first.first + b;
                i++;
                a = 0;
            }
            else {
                sub[cAux].first.second+=1;
                a = sub[cAux].first.second;
            }
    
        }
    
        if(i==0)
            cout << i << " " << 0 << endl;
        else
            cout << i << " " << tempo << endl;
        i = 0;
        tempo = 0;
      }
    
      return 0;
    }
  • Miguel Araújo replied 4 years ago

    Cristhian, obrigado. Com sua ajuda, eu removi as falhas. Abraços

  • Cristhian Bonilha replied 4 years ago

    Talvez este enunciado não esteja muito claro.

    O objetivo do exercício é simular o funcionamento de uma competicão seguindo as regras da ACM/ICPC. Fazia sentido o enunciado ter tão pouca instrucão pois o exercício estava sendo apresentado na própria competicão, onde os competidores supostamente conheciam as regras.

    As regras da competicão são as seguintes:

    1. Se você resolver um exercício X no tempo T, esse tempo T é adicionado na sua pontuacão final.
    2. Se você tentou resolver um exercício X mas recebeu "incorrect" como resposta no tempo T, esse tempo T só é adicionado na sua pontuacão final se você, mais tarde na competicão, resolver este exercício X.
    3. Se você submeter uma solucão para o exercício X, o qual você já resolveu anteriormente, tal submissão será ignorada e sua pontuacão não é afetada.

    Basicamente seu código não segue a terceira regra. Aliás, dá uma olhada no tamanho do seu vetor, uma vez que ele atualmente não comportaria todas as letras do alfabeto.

  • Miguel Araújo replied 4 years ago

    Galera, estou levando WA nesta questão. Realmente, eu não sei se entendi completamente ela, até porque eu não entendi direito nem o que foi discutido nesta seção do fórum. Alguém, por favor, pode tentar me explicar melhor este problema? Grato pela atenção e compreensão.

    AC!
  • Matheus Leão replied 4 years ago

    A sua lógica está certa, mas você está acrescentando itens numa string que não tem tamanho definido. Não sei como a string se comporta, mas isso não dará certo (só use string pra ler e manipular depois). Em vez disso, use char [TAM] e veja se funciona.

  • Tailo Mateus replied 4 years ago

    Alguém sabe algum caso que o meu código não passe? Obrigado

    #include<iostream>
    #include<string>
    
    using namespace std;
    int main()
    {
        int A,B,C,D = 0,d,i,j,h = 0, f = 0, total = 0, v;
        string Armazena, Letra, Acerto, ArmazenaIn;
        while(true)
        {
            cin >> A;
            if(A == 0)
                break;
            for(i = 0;i < A; i++)
            {
                  cin >> Letra;
                  cin >> B;
                  cin >> Acerto;
                  if(Acerto == "correct")
                  {
                      Armazena[h] = Letra[0];
                      h++;
                      total = total + B;
                      D++;
    
                  }
                  if(Acerto == "incorrect")
                  {
                      ArmazenaIn[f] = Letra[0];
                      f++;
                  }
            }
            for(d=0;d<f;d++)
            {
                  for(v=0;v<h;v++)
                  { 
                      if(Armazena[v] == ArmazenaIn[d])
                      {
                         total = total + 20;
                         break;
                      }
                  }
            }
            cout<<D <<" "<<total<<endl;
            total = h = f = D = 0;
        }   
        return 0;
    }
  • Tailo Mateus replied 4 years ago

    Alguém tem mais casos de testes? Obrigado

  • Matheus Leão replied 4 years ago

    Você só deve considerar a primeira vez que recebe correct e mais 20 para cada caso de incorrect. Não importa se o incorrect vem antes ou depois do correct, o que importa é se ele é julgado alguma vez correct. Teste este caso: 3 A 10 incorrect A 20 correct A 40 incorrect 0

  • Atilla9 replied 4 years ago

    Estou recebendo Wrong Answer 40% alguem pode me indicar o problema? VLW

    #include <iostream>
    
    using namespace std;
    
    struct result
    {
        int time;
        bool state;
    };
    
    int main()
    {
        result r[91];
        int n;
        while(cin >> n && n != 0)
        {
            for(int a = 65; a <= 90; a++)
            {
                r[a].state = false;
                r[a].time = 0;
            }
            int correct = 0;
            int sum = 0;
    
            for(int a = 0; a < n ; a++)
            {
                char question;
                int time;
                string state;
    
                cin >> question >> time >> state;
    
                if(state.compare("correct") == 0 )
                {
                    correct++;
                    if( r[(int)question].state == true )
                        r[(int)question].time += 20;
    
                    r[(int)question].time += time;
    
                }
                else
                    r[(int)question].state = true;
            }
    
            for(int a = 65; a <= 90; a++)
                sum += r[a].time;
    
            cout << correct << ' ' << sum << endl;
        }
        return 0;
    }
  • Cristhian Bonilha replied 5 years ago

    Por algum motivo, eh melhor voce declarar seus vetores como globais. Isso faz com que voce nao leve mais TLE.

    Agora seu problema eh WA, para o seguinte caso:

    3
    A 10 incorrect
    A 20 correct
    A 30 incorrect
  • Edmundo Rodrigues replied 5 years ago

    Complexidade O(n+3*26) dando TLE. Estou fazendo algo desnecessário?

    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    int main() {
    
        while(1) {
            int n;
            scanf("%d", &n);
    
            if(!n)
                break;
    
            int S = 0, P = 0, foi[26], acum[26];
            memset(foi, 0, sizeof foi);
            memset(acum, 0, sizeof acum);
    
            for(int i = 0; i < n; i++) {
                char u, res[1<<5];
                int t;
    
                scanf(" \n %c %d %s\n", &u, &t, res);
    
                int ii = u - '0';
                if(strcmp(res, "correct") == 0 && foi[ii] == 0)
                    foi[ii] = 1, P += t, S++;
                else
                    acum[ii] += 20;
            }
    
            for(int i = 0; i < 26; i++)
                if(foi[i] && acum[i] > 0)
                    P += acum[i];
    
            printf("%d %d\n", S, P);
        }
    
        return 0;
    }
  • Lucas Steffen replied 5 years ago

    Crithian estou tendo o mesmo problema em todas as submissões de todos os problemas. Estou tendo que substituir 'scanf()' por 'std::cin', e 'gethcar()' por 'std::cin.get()'.

    Até ai até da para contornar, o problema é que não há substituto pra o 'sscanf()'...

  • Cristhian Bonilha replied 5 years ago

    Tá vendo a variável Questão? Acho que você confundiu os indices ali. Faça o contrário:

    char Questao[310][2];
  • Lucas Steffen replied 5 years ago

    Cristhian, troquei os 'getchar()', tirei, substitui por espaço, substitui por '%*c', criei uma variável char para ler as quebras de linha e nada...

  • Cristhian Bonilha replied 5 years ago

    Eu desconfio que você deva jogar o getchar após o if(N == 0), e tirar aquele segundo getchar.

    Se isso não funcionar, tire os getchars e adicione um espaço aqui:

    scanf("_%c %d %s",&Questao[i][0],&Tempo[i],Resultado); // onde está o _
  • Lucas Steffen replied 5 years ago

    Vou passar só o main na parte da leitura:

    int main(void)
    {
        unsigned int N,i,Tempo[310];
        char Questao[2][310],Resultado[20];
        while(1){
            scanf("%d",&N);
            getchar();
            if(N==0)break;
            for(i=0;i<N;i++){
                scanf("%c %d %s",&Questao[i][0],&Tempo[i],Resultado);
                getchar(); 
                if(Resultado[0]=='c'){
                    Questao[i][1]=1;
                }
                else{
                    Questao[i][1]=0;
                }
            }
    //      Exibir(Questao,Tempo,N);
            Acertos(Questao,Tempo,N);
        }
        return(0);
    }

    Está dando runtime error, tentei trocar o scanf por getchar, separar as leituras e nada... A função Exibir(char,int,int) me garante que está sendo lido certo.

  • URI Online Judge replied 5 years ago

    Não dá! :) O problema não é o uso do ArrayList mas sim os métodos de entrada e saída que você utiliza, evite utilizar Scanner e System.out pois não são muito eficientes para I/Os grandes.

    MOD
  • Joe replied 5 years ago

    Não da pra aumentar o tempo não pra PODER usar ArrayList ??? já foram vários problemas em java que fiz que não passa de jeito nenhum com ArrayList vê isso ae ajuda ae uai!!!

1 of 2