Editorial for Ранкове


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence.
by: donchominkov

Solution with comments in Java:

static void solveRanks() {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();

    Integer[] numbers = new Integer[n];

    // We need a copy of the array
    //  for the algorithm
    Integer[] numbersToSort = new Integer[n];

    for (int i = 0; i < n; i++) {
        numbers[i] = in.nextInt();
        numbersToSort[i] = numbers[i];
    }

    // Sort the numbers, so we can find their position later
    //  reverse order, so the position is the correct one
    //  without complex formulas
    // Example:
    //  numbers: 4 1 2 3
    //  result: 1 4 3 2
    //  numbersToSort: 4 3 2 1
    //  index of 4 in sorted: 0
    //  index of 1 in sorted: 3
    //  index of 2 in sorted: 2
    //  index of 3 in sorted: 1
    //  if we add 1 to the indices, we get the result
    Arrays.sort(numbersToSort, Comparator.reverseOrder());

    for (int i = 0; i < numbers.length; i++) {
        int index = 0;

        // Find the index in the sorted array
        for (int j = 0; j < numbersToSort.length; j++) {
            if (numbersToSort[j].equals(numbers[i])) {
                index = j;
                break;
            }
        }

        // The result is the index + 1,
        //  as explained above
        numbers[i] = index + 1;
    }

    // Just print the numbers
    for (int number : numbers) {
        System.out.print(number + " ");
    }

    System.out.println();
}

Comments


  • 1
    borislav
     commented on Sept. 15, 2018

    Бих предложил, според мен, по-просто решение. Използвам само един масив, не сортирам и отпечатвам резултата с един оснавен цикъл.

    import java.util.Scanner;

    public class Ranks {

    public static void main (String args[]) {
    
        Scanner reader = new Scanner(System.in);
        int N = reader.nextInt();
        int numbers [] = new int[N];
        for (int i=0; i<N; i++) { numbers[i] = reader.nextInt(); }
        int maxRank = N;
    
        for (int i=0; i<N; i++) {
            int number = numbers [i];
            int rank = 1;
            for (int j=0; j<N; j++) {
                if (number<numbers[j]) {
                    rank++;
                    if (rank >= maxRank) {
                        maxRank--;
                        break;
                    }
                }

    С вътрешния цикъл намирам ранга на числото от масива. Всяко открито следващо по-голямо число увеличава ранга на текущото число.

    Когато се достигне текущият най-голям ранг, цикълът прекъсва.

            }
            System.out.print (rank + " ");
        }
    
    }

    }


    • 0
      3akobah
       commented on Sept. 18, 2018 edited

      Решението ти е чисто, но много пъти извърта масива, а последните тестове са с доста числа и там програмата ти започва да трупа време. Аз съм го направил с двоично търсене.