• 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();
          }
        }
    
      }
    
  • 相关阅读:
    HDU 2108 Shape of HDU (判断是不是凸多边形 叉乘)
    三,对于printf函数和C语言编程的初步拓展
    二,养成良好的写代码习惯
    一,彻底理解第一个C语言程序 Hello World
    归并排序(看了别人的博客明白了也写个博客,希望这样不算抄袭~)
    汉诺塔
    最小生成树
    堆排序
    二叉排序树
    双关键字快排
  • 原文地址:https://www.cnblogs.com/blogxjc/p/14314724.html
Copyright © 2020-2023  润新知