题意

每次操作可以给数组里的某个元素除以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)
}