比赛的时候没写出来,看了大佬答案以后明白过来的,加个注释说明一下解法
public class TowerGame2 { public static void main(String[] args) { // input Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int k = scanner.nextInt(); int[] data = new int[n]; for(int i=0; i<n; i++) { data[i] = scanner.nextInt(); } Arrays.sort(data); // cal result from two paths int res1 = 0; int res2 = 0; for (int i = 0; i < k; i++) { // 若把所有较小高度补到第 k 大的高度,需要的步数 res1 += (data[k-1] - data[i]); // 若把所有较大高度削到倒数第 k 大的高度,需要的步数 res2 += (data[n-1-i] - data[n-1-k+1]); } int index1=k, index2=n-1-k; // 如果第 k 大的高度 h1 在后面的数值中还重复出现了 m 次 // 则说明多进行了 m 次操作 while(index1<n && data[index1++]==data[k-1]) res1--; // 如果倒数第 k 大的高度 h2 在后面的数值中还重复出现了 l 次 // 则说明多进行了 l 次操作 while(index2>=0 && data[index2--]==data[n-1-k+1]) res2--; // 如果 res1 和 res2 中有负值 // 则说明在一开始第 k 大或倒数第 k 大的高度就已经有了 k 个 // 此时返回0 System.out.println(Math.max(0, Math.min(res1, res2))); } }