import java.util.*;
public class MainC {
public static void swap(int[] tower, int i, int j){
int tem = tower[i];
tower[i] = tower[j];
tower[j] = tem;
}
// 对tower调整,保证有序,复杂度O(k)
public static void helper(int[] tower){
for(int i = 0; tower[i] > tower[i+1];++i)
swap(tower, i, i + 1);
for(int i = tower.length - 1; tower[i-1] > tower[i]; --i)
swap(tower, i - 1, i);
}
public static int s2(int[] tower, int k){
int time = 0;
int has = 0;
Arrays.sort(tower);
while(true){
int presum = 0;
int tailsum = 0;
helper(tower);
// 在保证tower有序的情况下,结果总是出现在前k个或者后k个
if(tower[0] == tower[k-1]
|| tower[tower.length - k] == tower[tower.length - 1]){
return time;
}
for(int i = 0, j = tower.length - 1; i < k; ++i, --j){
presum += tower[i];
tailsum += tower[j];
}
if(has > 0){
// 不成熟的想法认为,目标就是使有序tower的前k个或后k个相同,因此选择能够最快偏向均值的策略
double f1 = Math.abs((double)presum/k - tower[0]);
double f2 = Math.abs((double)tailsum/k - tower[tower.length-1]);
if(f1 > f2){
tower[0]++;
has--;
}else{
tower[tower.length-1]--;
has++;
}
}else{
tower[tower.length-1]--;
has++;
}
time++;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] tower = new int[n];
for(int i = 0; i < n; ++i)
tower[i] = sc.nextInt();
System.out.println(s2(tower, k));
}
}
不确定思路正确,欢迎大佬指正