题意
每次操作可以给数组里的某个元素除以2,向下取整,问最少需要多少次操作可以使得所有元素相等
思路
感觉这个题的数据范围应该没有很强,算是水过去了
枚举了a[i]所以可以变成的值,其中mp[x]表示可以变成x的数的个数,cnt[x]表示变成x全部所需要的操作数。
最后在所有mp[x]=n的值里,取一个cnt[x]的最小值
Go代码
package main
import (
"fmt"
"math"
"sort"
)
func min(a,b int) int {
if a < b {
return a
}
return b
}
func main() {
var n int
fmt.Scan(&n)
a := make([]int,n)
for i := 0; i < n; i ++ {
fmt.Scan(&a[i])
}
sort.Ints(a)
mp := make(map[int]int,n)//记录x的个数
cnt := make(map[int]int,n) //记录变成x需要的次数
for i := 0; i < n; i ++ {
now := 0
for a[i] > 0 {
mp[a[i]]++
cnt[a[i]] += now
now ++
a[i] /= 2
}
}
ans := math.MaxInt
for k,v := range cnt {
if mp[k] != n {
continue
}
ans = min(ans,v)
}
fmt.Print(ans)
}

京公网安备 11010502036488号