比赛的时候没写出来,看了大佬答案以后明白过来的,加个注释说明一下解法
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)));
}
} 
京公网安备 11010502036488号