链接
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();
- }
- }
- }
来源: http://www.bubuko.com/infodetail-3719151.html