STPAR - Street Parade

Mọi người giúp em với ạ , em đã check nhièu test case ra đúng nhưng khi submit trên spoj thì vẫn nhận phản hồi là wrong answer
Đề bài :
For sure, the love mobiles will roll again on this summer’s street parade. Each year, the organisers decide on a fixed order for the decorated trucks. Experience taught them to keep free a side street to be able to bring the trucks into order.

The side street is so narrow that no two cars can pass each other. Thus, the love mobile that enters the side street last must necessarily leave the side street first. Because the trucks and the ravers move up closely, a truck cannot drive back and re-enter the side street or the approach street.

You are given the order in which the love mobiles arrive. Write a program that decides if the love mobiles can be brought into the order that the organisers want them to be.

Input There are several test cases. The first line of each test case contains a single number n, the number of love mobiles. The second line contains the numbers 1 to n in an arbitrary order. All the numbers are separated by single spaces. These numbers indicate the order in which the trucks arrive in the approach street. No more than 1000 love mobiles participate in the street parade. Input ends with number 0.

Output For each test case your program has to output a line containing a single word “yes” if the love mobiles can be re-ordered with the help of the side street, and a single word “no” in the opposite case.

import java.util.*;

class Main {
    public static Scanner sc = new Scanner(System.in);

    public static int[] cal(int a[]) {
        Stack<Integer> stack = new Stack<>();
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < a.length; i++) {
            list.add(a[i]);
        }
        list.sort(Collections.reverseOrder());
        int result[] = new int[a.length];
        int n = a.length;
        int m = a.length;
        int i = 0;
        while (n >= 1) {
            if (stack.isEmpty() != true && stack.get(stack.size() - 1) == list.get(m - 1)) {
                result[i] = stack.pop();
                i++;
                m--;
            } else {
                if (a[n - 1] != list.get(m - 1)) {
                    stack.push(a[n - 1]);
                    n--;
                } else {
                    result[i] = a[n - 1];
                    i++;
                    n--;
                    m--;
                }
            }
        }
        while (i < a.length) {
            result[i] = stack.pop();
            i++;
        }
        return result;
    }

    public static void main(String[] args) {
        while (sc.hasNext()) {
            int n = sc.nextInt();
            if (n == 0) {
                break; // Exit the loop when n is 0.
            }
            int a[] = new int[n];
            for (int i = n - 1; i >= 0; i--) {
                a[i] = sc.nextInt();
            }
            int s[] = cal(a);
            int[] temp = a;
            Arrays.sort(temp);
            boolean isPossible = Arrays.equals(temp, s);
            System.out.println(isPossible ? "yes" : "no");
        }
    }
}

cơ bản test này sai rồi

4
1 3 2 4
0

theo mình hiểu đề bài muốn là vô side street thì không có đi ra được khi đang có xe

nếu test này mình ra yes thì là đúng r chứ nhỉ
Nhập 1 3 2 4 thì thứ tự từ trái qua phải các xe lúc này là : 4->2>3>1
Xe 1 vào result , push 3 vào stack , 2 vào result , pop 3 ra và đẩy vào result , 4 vào result

đúng hết mà sao nó báo wrong answer kì vậy ta? Hay là nó ko cho tạo mảng phụ?

1 Like

mới test thì đúng là bị out of mem
bỏ cái list đi là ok
bai này ngta ràng buộc 1 ->n rồi nên khỏi cần cái list sort. track = 1 biến phụ là ok roài :v

    public static int[] cal(int a[]) {
        Stack<Integer> stack = new Stack<>();
        int result[] = new int[a.length];
        int n = a.length;
        int m = 1;
        int i = 0;
        while (n >= 1) {
            if (stack.isEmpty() != true && stack.get(stack.size() - 1) == m) {
                result[i] = stack.pop();
                i++;
                m++;
            } else {
                if (a[n - 1] != m) {
                    stack.push(a[n - 1]);
                    n--;
                } else {
                    result[i] = a[n - 1];
                    i++;
                    n--;
                    m++;
                }
            }
        }
        while (i < a.length) {
            result[i] = stack.pop();
            i++;
        }
        return result;
    }

á đù , cảm ơn bác nhiều nhé

cảm ơn bác @tntxtnt ấy chớ :sweat_smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?