思路
众数个数为n或者n-1
当数组平均值k为整数,众数个数为n个,众数为k;
否则众数个数为n-1个,对数组排序,众数可以是前n-1个数的均值向下取整k和k+1,后n-1个数的均值向下取整k和k+1,求出操作次数最小的。
代码
package main
/*
众数个数为n或者n-1
当数组平均值k为整数,众数个数为n个,众数为k;
否则众数个数为n-1个,对数组排序,众数可以是前n-1个数的均值向下取整k和k+1,后n-1个数的均值向下取整k和k+1,求出操作次数最小的。
*/
import (
"fmt"
"sort"
"math"
)
const N = 1e5 + 10
var a = make([]int, N)
func max(a, b int) (int) {
if(a > b) {
return a
}
return b
}
func min(a, b int) (int) {
if(a < b) {
return a
}
return b
}
func getstp(k, l, r int) (int) {
stp1 := 0
stp2 := 0
for i := l; i <= r; i++ {
if(a[i] < k) {
stp1 += (k - a[i])
} else if(a[i] > k) {
stp2 += a[i] - k
}
}
return max(stp1, stp2)
}
func main() {
n := 0
fmt.Scan(&n)
var s, s1, s2 int
for i := 0; i < n; i++ {
fmt.Scan(&a[i])
s += a[i]
}
sort.Ints(a[:n])
s1 = s - a[n-1]
s2 = s - a[0]
var stp int
stp = math.MaxInt
if((s % n) == 0) {
stp = getstp(s / n, 0, n - 1)
} else {
stp = min(stp, getstp(s1 / (n - 1), 0, n - 2))
stp = min(stp, getstp(s1 / (n - 1) + 1, 0, n - 2))
stp = min(stp, getstp(s2 / (n - 1), 1, n - 1))
stp = min(stp, getstp(s2 / (n - 1) + 1, 1, n - 1))
}
fmt.Print(stp)
}