比赛的时候没写出来,看了大佬答案以后明白过来的,加个注释说明一下解法

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

}