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();
}
}
}