题解 | 游游的除2操作

游游的除2操作

https://www.nowcoder.com/practice/b797f46aa75145a0bbe112099f7cbd18

step1:创建一个字典map,其key表示数组中的元素,value表示该元素在数组中出现的个数。我们维护所有key中的最小值minK。

step2:由于map底层是红黑树,其key是按照从小到大排列的,因此我们很容易获得其最大的key。对这个key,先将其从map中移除,然后对该key值进行二进制右移的操作(即题目中的除以2向下取整),每一次操作,实际的操作数为key对应的value。经过若干次操作,直到key的值小于等于minK。此时将新的键值对key-value更新到map中。

step3:重复step2,直到map中只剩下一个key-value为止。

#include <iostream>
#include <map>
using namespace std;

int main() {
    int n, a, minK = INT32_MAX;
    cin >> n;
    map<int, int> mp;
    for (int i = 0; i < n; ++i) {
        cin >> a;
        ++mp[a];
        minK = min(minK, a);
    }
    int ans = 0;
    while (mp[minK] != n) {
        auto kv = *mp.rbegin();
        int key = kv.first;
        int value = kv.second;
        mp.erase(key);
        while (key > minK) {
            key >>= 1;
            ans += value;
        }
        mp[key] += value;
        minK = min(minK, key);
    }
    cout << ans;
}
全部评论

相关推荐

10-10 01:10
已编辑
深圳大学 测试开发
面了100年面试不知...:六月到九月,四个项目一个实习,是魔丸吗
投了多少份简历才上岸
点赞 评论 收藏
分享
哇哇的菜鸡oc:他这不叫校招offer,而是实习offer
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务