TOPIC

PROBLEM 1252 - URI Fórum 1.0

URI Online Judge asked 7 years ago

URI Online Judge Fórum 1.0

MOD

This topic was solved and cannot recieve new replies.

  • Gerson Groth replied 6 years ago

    Você nunca deve testar se um número é impar usando essa comparação

    if(a%2 == 1)

    pois se o número for negativo, o resto é igual a -1. Basta testar se é diferente de 0 ;) Além disso, falta uma quebra de linha no final (após o "0 0")

  • Bernardo Sulzbach replied 4 years ago

    std::sort causa segmentation faults com ordens mal definidas. Nesse problema, std::sort pode ser usado (eu e um outro usuário ali em cima resolvemos assim). Diria que é um problema com a ordem que tu definiu (ela não corretamente reflete a ordem do enunciado).

  • kuati replied 5 years ago

    Olá, boa noite pessoal!

    Estou recebendo resposta errada de 10%, alguém poderia indicar o caminho? Acho que deixei passar algo no enunciado.. Segue o código!

    #include <bits/stdc++.h>
    
    using namespace std;
    
    struct dado {
    
        int num, modulo;
    
        dado(int num, int modulo) {
            this->num = num;
            this->modulo = modulo;
        }
    
        bool operator<(const dado& d) const {
    
            if (modulo != d.modulo) return (modulo < d.modulo);
    
            if ((num % 2 == 1) && (d.num % 2 == 1)) return (num > d.num);
    
            if ((num % 2 == 0) && (d.num % 2 == 0)) return (num < d.num);
    
            return (num % 2 == 1);
        }
    };
    
    int main() { 
    
        int n, m, num;
    
        while (cin >> n >> m) {
    
            cout << n << " " << m << endl;
    
            if (n == m && n == 0) return 0;
    
            vector<dado> v;
    
            for (int c = 0; c < n; c ++) {
                cin >> num;
                v.push_back(dado(num, num % m));
            }
            sort(v.begin(), v.end());
    
            for (vector<dado>::iterator it = v.begin(); it != v.end(); it ++) {
                cout << it->num << endl;
            }
        }
        return (0);
    }
  • Marcello Marques replied 5 years ago

    RUNTIME ERROR, alguém sabe o motivo?

    #include <iostream>
    #include <algorithm>
    #include <utility>
    #include <vector>
    
    using namespace std;
    
    typedef long long int lli;
    
    bool compare(pair<lli, lli> A, pair<lli, lli> B)
    {
        if(A.first > B.first)
            return 0;
        else if(A.first < B.first)
            return 1;
        else{
            if(A.second%2==1 && B.second%2==0)
                return 1;
            if(A.second%2==0 && B.second%2==1)
                return 0;
            if(A.second%2==1 && B.second%2==1)
                if(A.second > B.second)
                    return 1;
                else
                    return 0;
            if(A.second%2==0 && B.second%2==0) 
                if(A.second >= B.second)
                    return 0;
            return 1;
        }
    
    }
    
    int main()
    {
        int N, M, i;
        lli aux;
        vector< pair<lli, lli> > v;
        vector< pair<lli, lli> >::iterator it;
    
        while(cin >> N >> M)
        {
            if(!N && !M){ cout << "0 0\n"; break; }
    
            v.clear();
            for(i=0; i<N; i++){
                cin >> aux;
                v.push_back(make_pair(aux%M, aux));
            }
    
            sort(v.begin(), v.end(), compare);
    
            cout << N << " " << M << endl;
            for(it=v.begin(); it!=v.end(); it++)
                cout << (*it).second << endl;
    
        }
    
        return 0;
    }
  • Claudivan Barreto replied 5 years ago

    Tá dando W.A, por que?

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    
    int m;
    
    int mod_two(int x){
        return x%2;
    }
    
    int mod_m(int x){
        return x%m;
    }
    
    bool compare(int x, int y){
        if(mod_m(x) < mod_m(y)){
            return true;
        }else if(mod_m(x) == mod_m(y)){
            if(mod_two(x) != mod_two(y)){
                if(mod_two(x) != 0)
                    return true;
                else
                    return false;
            }else if(mod_two(x) != 0){ 
                return x > y;
            }else{
                return x < y;
            }
        }
        return false;
    }
    
    int main(){
        vector<int> v(10010);
        int n, i;
    
        while(cin >> n >> m && n){
            for(i = 0; i < n; i++){
                cin >> v[i];
            }
            sort(v.begin(), v.begin()+n, compare);
            cout << n << ' ' << m << endl;
            for(i = 0; i < n; i++){
                cout << v[i] << endl;
            }
        }
    
        if(n == 0 && m == 0)
            cout << "0 0" << endl;
        return 0;
    }
  • Roger Benet replied 5 years ago

    Resolvido.

  • Miguel Araújo replied 6 years ago

    leocij, eu usei o sort da lib padrão (http://www.cplusplus.com/reference/algorithm/sort/), nem precisei fazer isso tudo. Tu só deve entender o exemplo que leva uma função como terceiro argumento e implementar ela. Cada caso desta função é explicada no problema.

  • Old man replied 6 years ago

    Resolvido

  • Old man replied 6 years ago

    O código está bem grande, mas foi a única forma que consegui realmente fazer funcionar. Bom, funcionar até que funciona, mas dá wrong answer. Já testei um montão de casos de teste. Todas as saídas estão comparadamente iguais às saídas do toolkit. Criei até um caso de teste fora da casa do inteiro de 32 bits com sinal e nada. :-(

    Segue o caso:

    11 10000
    -2147483648
    -21474836489
    21474836489
    -9223372036854775808
    9223372036854775807
    -170141183460469231731687303715884105728
    170141183460469231731687303715884105727
    10000
    1
    -1
    -10000
    11 1
    -2147483648
    -21474836489
    21474836489
    -9223372036854775808
    9223372036854775807
    -170141183460469231731687303715884105728
    170141183460469231731687303715884105727
    10000
    1
    -1
    -10000
    0 0

    Saída:

    11 10000
    -2147483648
    -9
    -1
    -1
    -1
    -10000
    0
    0
    10000
    1
    9
    11 1
    9
    1
    -1
    -1
    -1
    -9
    -2147483648
    -10000
    0
    0
    10000
    0 0

    Comparei pelo fc do MsDos e olha o resultado:

    c:\aula\URI>fc saida.txt toolkit-1252.out
    Comparando os arquivos saida.txt
    FC: nenhuma diferença encontrada

    Ps. Se alguém puder me dar uma dica para eu conseguir passar esse problema, já agradeço antecipadamente.

    Segue o código para análise:

    Resolvido
  • Omero Francisco Bertol replied 6 years ago

    Boa noite Moderadores,

    Estou recebendo "Wrong answer (10%)". Tem como enviar os arquivos de entrada e saída para chicobertol@gmail.com.

    Estou usando o método de ordenação "ShellSort".

    Eu já testei com os casos de testes que foram sugeridos no fórum... E nda :-(

    Obrigado!!!

    Obrigado pelas dicas e/ou sugestões. Problema resolvido e aceito.

    Um abraço (Prof. Omero)

  • Feer replied 7 years ago

    Não sei se está faltando algo, mas meu algoritmo está gerando respostas iguais em vários testes do toolkit...

    Resolvido.
    Problema de interpretação do enunciado ^^
  • Jhonatan Serafim replied 7 years ago

    Obrigado Flavio Bayer, passou! \o/

  • Flavio Bayer replied 7 years ago

    Creio que seu problema talvez seja o calculo do mod:

    this.mod = Math.abs(x % m);

    Eu não precisei calcular o abs do mod para conseguir passar e creio que não deve, conforme o enunciado: "um número negativo nunca pode ter módulo maior do que zero". Ou seja se você fizer -3%2 o resultado é -1, mas você está transformando para 1, o numero negativo está tendo mod maior que 0. Sim, há casos teste com números negativos(conforme enunciado: inteiro de 32 bits com sinal), o meu passou em todos os casos do Cristhian, porém não havia casos com números negativos, botei um '-' em alguns números da entrada do enunciado e achei meu erro.

  • Jhonatan Serafim replied 7 years ago

    Irei testar, obrigado Cristhian.

    Abraço.

  • Cristhian Bonilha replied 7 years ago

    Aqui estão alguns casos de teste maiores:

    https://www.dropbox.com/s/hwmohnpq897n1 ... ort_in.txt

    E alguns maiores ainda:

    https://www.dropbox.com/s/hlxz89gfrhzeo ... rt_in2.txt

    Se você não encontrar, experimente começar o algoritmo do zero, e busque uma abordagem diferente.

    Dica: Pense em como implementar um algoritmo que gera casos de teste.

  • Jhonatan Serafim replied 7 years ago

    Olá Pessoal,

    Alguém teria mais entradas para testar? Todas entradas que testei funcionaram.

    Abraço.

  • Jhonatan Serafim replied 7 years ago

    Olá Cristhian,

    Obrigado por responder, testei com as entradas fornecidas por você, gerei elas no toolkit e depois gerei no meu programa. Tudo é gerado exatamente igual. Abaixo segue a minha classe que contém o método de ordenação, não sei se esqueci de alguma regra de ordenação.

    static class Sort implements Comparable<Sort> {
            int x;
            int mod;
            boolean par;
    
            public Sort(int x, int m) {
                this.x = x;
                this.mod = Math.abs(x % m);
                this.par = x % 2 == 0;
            }
    
            public int compareTo(Sort o) {
                if (mod > o.mod)
                    return 1;
                if (mod < o.mod)
                    return -1;
                if (par && !o.par)
                    return 1;
                if (!par && o.par)
                    return -1;
                if (par && o.par) {
                    if (x > o.x)
                        return 1;
                    if (x < o.x)
                        return -1;
                } else {
                    if (x < o.x)
                        return 1;
                    if (x > o.x)
                        return -1;
                }
                return 0;
            }
        }
  • Cristhian Bonilha replied 7 years ago

    Apenas você e o administrador pode ver essa página que você postou..

    Experimente colar o seu código aqui, entre as tag's Code..

    Alguns casos de teste:

    10 3
    283
    286
    177
    115
    293
    235
    286
    192
    249
    121
    50 17
    362
    1027
    1190
    559
    263
    1426
    540
    426
    172
    736
    1211
    368
    567
    429
    782
    530
    362
    1123
    67
    1135
    929
    1302
    522
    558
    569
    1167
    1393
    1456
    511
    1042
    729
    873
    921
    419
    284
    37
    698
    824
    815
    870
    413
    526
    91
    980
    956
    873
    362
    170
    496
    781
    5 2
    105
    75
    134
    27
    86
    0 0
  • Jhonatan Serafim replied 7 years ago

    Olá, boa noite.

    Gostaria de saber se é possível postar mais alguns testes, pois todos os testes que realizei está igual ao toolkit. Submeti e não passou: http://www.urionlinejudge.com.br/judge/runs/code/179983.

    Obrigado. Att, Jhonatan Serafim.