AcWing 881. 整理书架
原题链接
简单
作者:
青影
,
2020-08-13 11:12:47
,
所有人可见
,
阅读 546
java 代码
import java.util.*;
class Main{
static class Node {
int value ;
int number;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //表示书架的排数
int k = sc.nextInt(); //每排书架上书的数量
int[][] arr =new int[n][k];
int[] cnt = new int[n]; //存储第i行的逆序对数量
//int[] index = new int[n];
Node[] nodes = new Node[n]; // number 表示第几行,value 表示那一行的逆序对数量
for(int i = 0; i < n;i++){
nodes[i] =new Node();
for(int j = 0;j < k;j++){ //先将每一组数据读入
arr[i][j] = sc.nextInt();
}
for(int j = 0;j < k;j++){ //计算逆序对个数
for(int m = j+1;m <k;m++){
if(arr[i][j]>arr[i][m]) cnt[i]++;
}
}
nodes[i].value = cnt[i];
nodes[i].number=i;
}
Arrays.sort(nodes, new Comparator<Node>() { //排序采用稳定排序
@Override
public int compare(Node o1, Node o2) {
if (o1.value!=o2.value){
return o1.value<o2.value?-1:1;
}else {
return o1.number<o2.number?-1:1;
}
}
});
System.out.print("[");
for(int i = 0;i < n;i++){
System.out.print("[");
for(int j =0;j < k;j++){
System.out.print(arr[nodes[i].number][j]);
if(j != k-1) System.out.print(", ");
}
System.out.print("]");
if(i != n-1) System.out.print(", ");
}
System.out.print("]");
}
}