TOPIC

PROBLEM 1375 - 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.

  • Samuel Eduardo replied 5 years ago

    20% W.A. Alguém consegue encontrar meu erro ? Valeu.

    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    #include<stdio.h>
    #include<cstring>
    #include<algorithm>
    #include<string>
    using namespace std;
    int Pos[1000000];
    int NPos[1000000];
    long int NCARRO[1000000];
    long int NPOSICAO[1000000];
    int Carros[1000000];
    int main()
    {
        int N;
        int Carro;
        int Mud;
    
        while (scanf("%d", &N) && N)
        {
            memset(Pos, 0, sizeof(Pos));
            memset(NPos, 0, sizeof(NPos));
            int MaiorCarro = -1;
            for (int i = 1;i <= N;i++)
            {
                scanf("%d %d", &Carro, &Mud);
                NPos[Carro] = i + Mud;
                if (Carro > MaiorCarro)
                    MaiorCarro = Carro;
            }
    
            int a = 0;
            for (int i = 1;i <= MaiorCarro;i++)
            {
                if (NPos[i] > 0)
                {
    
                    NCARRO[a] = i;
                    NPOSICAO[a] = NPos[i];
                    a++;
                }
            }
            bool Impossivel=false;
            for (int i = 0;i < a - 1;i++)
            {
                for (int j = i + 1;j < a;j++)
                {
                    if (NPOSICAO[i] > NPOSICAO[j])
                    {
                        swap(NPOSICAO[i], NPOSICAO[j]);
                        swap(NCARRO[i], NCARRO[j]);
                    }
                    else if (NPOSICAO[i] == NPOSICAO[j])
                    {
                        Impossivel = true;
                        break;
                    }
                }
            }
            if (Impossivel || a != N)
                cout << "-1" << endl;
            else
            {
                for (int i = 0;i < a;i++)
                {
                    string end = (i == a - 1) ? "\n" : " ";
                    cout << NCARRO[i] << end;
                }
            }
    
        }
    }
  • Igor Carpanese replied 4 years ago

    Essa entrada fala que o carro de número 1 perdeu uma posição em relação ao grid de largada. Como é possível que ele tenha perdido uma posição se ele já é o primeiro?

    Analogamente, o último carro ganhou uma posição. Porém, ele ganhou essa posição de quem, se ele já é o último?

    O problema não tem a ver com o número de ultrapassagens.

  • 🧙The Install Wizard 🧙 replied 5 years ago

    4 1 -1 3 0 2 0 4 1 0

    Por que a resposta dessa entrada é -1 ? Nao deveria ser : 1 4 3 2

    Nao entendo esse problema ...

  • Gerson Groth replied 6 years ago

    Isso. Você deve separar os valores por espaço, mas após o último valor não deve haver espaço algum...

  • targueriano replied 6 years ago

    Ou seja, o último valor do vetor não terá um espaço?

    Resolvido! Obrigado, muito obrigado Groth.

  • Gerson Groth replied 6 years ago

    Repare que agora você está recebendo PE. Isso deve-se ao fato de que você está imprimindo um espaço após cada valor, mas deve ser apenas entre os valores. Se corrigir isto, deve receber AC.

  • targueriano replied 6 years ago

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    
    /*
     int compare(const void * a, const void * b) {
     return (*(int*) a - *(int*) b);
     }
     */
    int main() {
        //cout.setf(ios::fixed);
        //cout.setf(ios::showpoint);
        //cout.precision(2);
    
        int n;
    
        while (cin >> n && n != 0) {
            int c[n], p[n];
            int pos[n];
            int aux = 0;
            int aux2 = n;
            bool chave = false;
            for (int var = 0; var < n; ++var) {
                pos[var] = 0;
            }
    
            for (int i = 0; i < n; ++i) {
                cin >> c[i] >> p[i];
    
                if (p[i] >= aux && p[i] < aux2) {
                    pos[i + p[i]] = c[i];
                }
                aux -= 1;
                aux2 -= 1;
            }
            for (int i = 0; i < n; ++i) {
                if (pos[i] == 0)
                    chave = true;
            }
            if (chave == true) {
                cout << -1 << endl;
            } else {
                for (int i = 0; i < n; ++i) {
                    cout << pos[i] << " ";
                }
                cout << endl;
            }
    
        }
    
        return 0;
    }

    Qual é o truque nessa questão? Não está acessando posição inexistente do vetor. Se não dá certo, o vetor fica com índice de valor nulo.

  • targueriano replied 6 years ago

    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
    
            Scanner ler = new Scanner(System.in);
    
            int n;
            n = ler.nextInt();
            while (n != 0) {
    
                int c[]= new int[n]; 
                int p[] = new int[n];
                int pos[] = new int[n];
                boolean resp = false;
    
                for (int i = 0; i < n; ++i) {
                    pos[i] = 0;
                }
    
                for (int i = 0; i < n; ++i) {
                     c[i] = ler.nextInt();
                     p[i] = ler.nextInt();
    
                    if (p[i] > 0 && p[i] <= n) {
                        pos[i + p[i]] = c[i];
                    } else if (p[i] < 0 && p[i] >= -1*n) {
                        pos[i + p[i]] = c[i];
                    } else {
                        pos[i] = c[i];
                    }
                    c[i] = 0;
    
                }
    
                for (int var = 0; var < n; ++var) {
                    if (pos[var] == 0) {
                        resp = true;
                    }
                }
    
                if (resp == true)
                    System.out.print(-1);
                else {
                    for (int var = 0; var < n; ++var) {
                        System.out.print(pos[var] + " ");
                    }
                }
    
                System.out.println();
                n = ler.nextInt();
    
            }
    
        }
    }
    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    
    /*
     int compare(const void * a, const void * b) {
     return (*(int*) a - *(int*) b);
     }
     */
    int main() {
        //cout.setf(ios::fixed);
        //cout.setf(ios::showpoint);
        //cout.precision(2);
    
        int n;
    
        while (cin >> n && n != 0) {
            int c[n], p[n];
            int pos[n];
            bool resp = false;
    
            for (int i = 0; i < n; ++i) {
                pos[i] = 0;
            }
    
            for (int i = 0; i < n; ++i) {
                cin >> c[i] >> p[i];
    
                if (p[i] > 0 && p[i] <= n) {
                    pos[i + p[i]] = c[i];
                } else if (p[i] < 0 && p[i] >= -1*n) {
                    pos[i + p[i]] = c[i];
                } else {
                    pos[i] = c[i];
                }
                c[i] = 0;
    
            }
    
            for (int var = 0; var < n; ++var) {
                if (pos[var] == 0) {
                    resp = true;
                }
            }
    
            if (resp == true)
                cout << -1;
            else {
                for (int var = 0; var < n; ++var) {
                    cout << pos[var] << " ";
                }
            }
    
            cout << endl;
    
        }
        return 0;
    }

    Não vai, não sei resolver esse problema. Ele é mais difícil que o burlando a maratona.

    Tem como passar outros casos de testes? Os do exemplo sempre dão certo.

  • Gerson Groth replied 6 years ago

    Nesse trecho

    pos[i + p[i]] = c[i];

    No terceiro teste, por exemplo, vc irá fazer

    pos[1 + -345] = 9

    Note que estará tentando acessar uma posição negativa do teu vetor, que não é válida. Além disso, como o limite para troca de posições é 10^6, o teu vetor não irá suportar um valor tão alto...

  • targueriano replied 6 years ago

    Mesmo assim estou tendo dificuldade para visualizar o problema.

  • Gerson Groth replied 6 years ago

    Cuidado com os limites. Você deve estar recebendo RE por estar acessando posições fora do teu vetor (tanto maiores do que a capacidade, quanto negativas).

  • targueriano replied 6 years ago

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    
    /*
     int compare(const void * a, const void * b) {
     return (*(int*) a - *(int*) b);
     }
     */
    int main() {
        //cout.setf(ios::fixed);
        //cout.setf(ios::showpoint);
        //cout.precision(2);
    
        int n;
    
        while (cin >> n && n != 0) {
            int c[n], p[n];
            int pos[10001];
            bool resp = false;
            for (int var = 0; var < 10001; ++var) {
                pos[var] = 0;
            }
    
            for (int i = 0; i < n; ++i) {
                cin >> c[i] >> p[i];
    
                if (p[i] > 0 ) {
                    pos[i + p[i]] = c[i];
                } else if (p[i] < 0 ) {
                    pos[i + p[i]] = c[i];
                } else {
                    pos[i] = c[i];
                }
                c[i] =0;
    
            }
    
            for (int var = 0; var < n; ++var) {
                if(pos[var]==0){
                    resp = true;
                }
            }
    
            if (resp == true)
                cout << -1;
            else {
                for (int var = 0; var < n; ++var) {
                    cout << pos[var] << " ";
                }
            }
    
            cout << endl;
    
        }
        return 0;
    }

    Recebo RE. O meu compilador não mostra qualquer erro com relação aos vetores e os resultados são os mesmos dos testes.

    Alguém poderia ajudar?

  • Cristhian Bonilha replied 6 years ago

    É só ler os inteiros conforme especificado, nada de especial.

  • Pablo Felipe Leonhart replied 6 years ago

    Recebi Runtime error, precisa alguma atenção especial quanto à leitura dos dados de entrada?

  • Marcos Bustamante replied 6 years ago

    Valeu Cristhian nem tinha notado esses erros :). Valeu

  • Cristhian Bonilha replied 6 years ago

    Eu mudei duas linhas e ele passou.

    Se a posição calculada dele for 0, também é inválida, portanto basta mudar a condição:

    if(j > car || j <= 0)cond = 1;

    Nesse seu laço você confundiu o seu iterador, colocando n ali, no lugar de i:

    for(i=1; i<=car; i++){
        if(vet[i] == 0)cond = 1;
    }
  • Marcos Bustamante replied 6 years ago

    Galera alguém pode me ajudar a encontrar o erro

    Retirei o código pq passo