TOPIC

PROBLEM 1758 - URI Fórum 1.0

beecrowd asked 9 years ago

URI Online Judge Fórum 1.0

MOD

This topic was solved and cannot recieve new replies.

  • pgpierina replied 7 years ago

    Os exemplos do uri dao certo, mas ele nao aceita o codigo. Segue o codigo em baixo.

    define _CRT_SECURE_NO_WARNINGS

    include

    include

    void main() { int o, k, q, c, t, p, n, i, j, x;

    double aux, soma, nota[50], media;
    
    //media tem dois pontos decimais
    //nota tem um ponto decimal
    
    scanf("%i", &t);
    
    for (i = 0; i < t; i++)
    {
    
        scanf("%i", &p);
        //quantidade de provas
        scanf("%i", &n);
        //quantidade de alunos
    
        for (j = 0; j < n; j++)//para cada aluno separado
        {
            media = 0;
            aux = 0;
            soma = 0;
    
            for (x = 0; x < p; x++)//pegar nota de cada
            {
                scanf("%lf", &nota[x]);
                soma = soma + nota[x];
            }
    
            media = soma / (x);
    
            //Ordenar para achar nota maior para media[0]
            for (c = 0; c < (p - 1); c++)
            {
                for (q = 0; q < (p - c - 1); q++)
                {
                    if (nota[q]>nota[q + 1])
                    {
                        aux = nota[q];
                        nota[q] = nota[q + 1];
                        nota[q + 1] = aux;
                    }
                }
            }
    
            //Printar a maior nota se nota for entre 4 e 7
    
            if (media<7 && media >= 4)
            {
                if (nota[q + 1]>media && nota[q + 1]<7)
                {
                    printf("%.2lf\n", nota[q + 1]);
                }
                else
                {
                    if (nota[q]>media && nota[q]<7)
                    {
                        printf("%.2lf\n", nota[q]);
                    }
                    else
                    {
                        if (nota[q - 1] > media && nota[q - 1]<7)
                        {
                            printf("%.2lf\n", nota[q - 1]);
    
                        }
                        else
                        {
                            if (nota[q - 2] > media && nota[q - 2]<7)
                            {
                                printf("%.2lf\n", nota[q - 2]);
                            }
                            else
                            {
                                if (nota[q - 3] > media && nota[q - 3]<7)
                                {
                                    printf("%.2lf\n", nota[q - 3]);
                                }
                                else
                                {
                                    printf("%.2lf\n", media);
                                }
                            }
                        }
                    }
                }
    
            }
    
            if (media < 4.0)
            {
                printf("%.2lf\n", media);
            }
    
            if (media >= 7.0)
            {
                printf("%.2lf\n", nota[x - 1]);
            }
        }
    
    }
    
    system("pause");

    }

  • mmendes2 replied 8 years ago

    Neste caso o aluno vai pra prova final, a sua nota então será calculada da seguinte maneira:

    A média é 4.8, daí vc pega a maior nota dele que seja maior que a média e menor que 7.

    No exemplo acima temos que 10 é maior que 4.8 e maior que 7, descarta ela; 5.0 é maior que 4.8 e menor que 7; e 4.0 é menor que 4.8.

    A maior nota dele maior que a média e menor que 7 é 5.0.

    Eu também demorei pra entender isso. Implementei e consegui o Accepted.

  • tmateus replied 8 years ago

    Por que nesse caso 10.0 5.0 5.0 4.0 0.0 a saída é 5.0? Obrigado!

  • thalyson004 replied 9 years ago

    devem ter tirado todos os casos que a precisão daria problema, o AC Rate foi de 0.8% para 79.21% '-'

  • DamiHenrique replied 9 years ago

    Depois de um 1kg de w.a e algumas gambs, meu código não bate nem com todos os casos de exemplo e recebi accepted.. (y)

  • MiguelAraujo replied 9 years ago

    Galera, levei 100% WA nesta questão, mas tenho certeza que não tem nada errado no meu código. Eu coletei umas entradas fornecidas por MilesMatheson e meitcher (+- 1K casos) e verifiquei. Todos os resultados batem com o toolkit. Como posso estar levando 100% WA desta forma?

    Abaixo segue meu código. Grato desde já!

    AC!

    O problema foi rejulgado e recebi Accepted.

  • thalyson004 replied 9 years ago

    do jeito que vc ler a questão, aparenta que as saídas devem ser truncadas em duas casas, porém não é isso o esperado

    porém parece que a questão está com erro na correção, pois nem mesmo o autor do problema conseguiu passar ela xD

  • rbenet replied 9 years ago

    Código Aceito

  • mtreviso replied 9 years ago

    Tem algumas dicas para o código ficar mais rápido em python:

    • Faça a leitura usando o sys.stdin.readline();

    • Faça o split() e já aplica os tipos com um map: notas = map(float, sys.stdin.readline().split());

    • Nunca use range(n) para iterar, use xrange(n). A diferença entre os dois é que range gera uma lista de 1 a n e depois itera sobre cada posição dessa lista, já xrange faz i+1 e devolve esse valor (faz um yield por baixo dos panos);

    • Cada laço do python é muito lento, sendo assim tente economizar o máximo de laços possíveis.

    • Se o URI permite (acho que sim), adicione o módulo psyco e chame o método full(), dependendo do código isso fica mais rápido:

    try:
        import psyco
        psyco.full()
    except:
        pass

    No seu caso, o segundo laço pode ser incluso junto com o primeiro, acho que com isso seu código talvez irá passar, porém não tenho tanta certeza, pois reenviei o código python que recebeu AC, e ele ganhou TLE. Ou seja, tem que pedir para os moderadores aumentarem o tempo limite para python para pelo menos 1.5s.

    Valeu!

  • gduarte replied 9 years ago

    Eu tentei fazer em Python como meitcher disse, porém estou tomando TLE. Ainda não sei muito sobre Python talvez seja os métodos de leitura e escrita, será que alguém pode me auxiliar ?

    TC = input();
    
    while(1):
        TC -= 1
    
        s = raw_input()
        s = s.split(' ')
        p = int(s[0])
        n = int(s[1])
    
        alunos = []
        media = []
        for i in range(0, n):
            aux = 0
            x = raw_input()
            x = x.split(' ')
            alunosAux = []
            for j in range(0, p):
                y = float(x[j])
                alunosAux.append(y)
                aux += alunosAux[j]
            alunos.append(alunosAux)
            media.append(aux / p)
    
        for i in range(0, n):
            if media[i] < 4.0:
                print "%.2f" % media[i]
            elif media[i] >= 7.0:
                ans = 0;
                for j in range(0, p):
                    ans = max(ans, alunos[i][j])
                print "%.2f" % ans
            else:
                ans = media[i]
                for j in range(0, p):
                    if alunos[i][j] > ans and alunos[i][j] < 7.0:
                        ans = max(ans, alunos[i][j])
                print "%.2f" % ans;
    
        if(TC == 0):
            break
    MOD
  • mtreviso replied 9 years ago

    Aqui tem mais: https://gist.github.com/meitcher/9373366dd2b63463c863

    Utilizando long double também recebi WA 10%. Acho que é erro por causa da precisão mesmo.

    Valeu!

  • gduarte replied 9 years ago

    Alguém tem mais casos de testes? Todos que testei aqui bateram com o toolkit, mas ainda recebo WA 10%

    MOD
  • mtreviso replied 9 years ago

    Teste com os seguintes casos de teste:

    2
    3 5
    3.1 7.7 0.5
    0.5 5.9 5.5
    0.1 8.5 9.2
    9.3 4.6 8.0
    5.4 3.5 0.0
    5 5
    9.0 10.0 6.0 6.0 6.0
    10.0 5.0 5.0 5.0 5.0
    10.0 5.0 5.0 4.0 0.0
    4.0 4.0 4.1 4.0 3.9
    6.9 6.9 6.9 7.0 6.9

    Valeu!

  • mtreviso replied 9 years ago

    Acabei de submeter o mesmo código em Python (com 1K de otmizações, tem que aumentar o tempo limite aí) e passou. Será então que temos que utilizar alta precisão para passar? Mas não vejo o problema, uma vez que usei inteiros para todas as comparações, única exceção são os printfs que necessitam conversão para double...

  • mtreviso replied 9 years ago

    Estou recebendo WA (70%) nesse problema, porém não consegui encontrar um bug no meu código ou um caso de teste contraditório. Tem como alguém me ajudar?

    removido após acc

    Será que é erro de arredondamento na hora de printar?