ECNU 2947 行数据的排序

ECNU 2947 行数据的排序

链接

https://acm.ecnu.edu.cn/problem/2947

题目

单点时限: 2.0 sec

内存限制: 256 MB

有 n 数据,每行有若干数量不等的整数组成。现在要对这 n 据排序。

排序原则为:

首先比较行中的第一个数的值,将第一个数大的行排在前面;

若第一个数相等的话,则按照第二个数的值排序(若某行没有第二个数,则该行排在后面);

若第二个数还是相等的话,则比较第三个数,依次类推。

例如:

14 38 11 89

27 34

27 12 34

27

92 2 3 1

17 2
排序的结果为:

92 2 3 1

27 34

27 12 34

27

17 2

14 38 11 89

输入格式
第 1 行:整数 t() 为问题数

第 2 行:第一个问题的整数n()

第 3 ∽ N+2 行:第一个问题的每行的数据 ai 和表示行结束的标志-1, 数据个数。, 数据之间由一个空格分隔。

后面是第 2-t 个问题的数据。格式与第一个问题相同。

输出格式
对于每个问题,输出排序后的结果。

格式为:每行输出一行数据,数据之间有一个空格。

思路

蛮离谱的一道题,难倒是不难,但是很麻烦。
用比较器,建立类,每个类存放一行数据,加上length表示数据个数。
比较器比较,在可选长度内,从头比到尾,不然的话比较长度即可。
调节格式输出。

代码

   public static class Team {
    public int[] a = new int[52];
    public int length;
  }

  public static void fun() {
    Scanner sc = new Scanner(System.in);
    int t = sc.nextInt();
    for (int i = 0; i < t; i++) {
      int n = sc.nextInt();
      Team[] team = new Team[n];
      for (int j = 0; j < n; j++) {
        team[j] = new Team();
      }

      for (int j = 0; j < n; j++) {
        int count = 0;
        while (true) {
          int temp = sc.nextInt();
          if (temp == -1) {
            break;
          }
          team[j].a[count] = temp;
          count++;
        }
        team[j].length = count;
      }
      Arrays.sort(team, new Comparator<Team>() {
        @Override
        public int compare(Team o1, Team o2) {
          for (int i = 0; i < Math.min(o1.length, o2.length); i++) {
            if (o1.a[i] != o2.a[i]) {
              return o2.a[i] - o1.a[i];
            }
          }
          return o2.length - o1.length;
        }
      });

      for (int j = 0; j < n; j++) {
        for (int k = 0; k < team[j].length; k++) {
          System.out.print(team[j].a[k] + " ");
        }
        System.out.println();
      }
    }

  }
原文地址:https://www.cnblogs.com/blogxjc/p/14314724.html