abc323D 合并泥巴

题面:有n种泥巴,第i种有c[i]块,大小为s[i]。每次操作可以选择2块大小同为x的泥巴,将其合并成1块大小为2x的泥巴。操作次数不限,问最终至少有多少块泥巴?
范围:n<=1E5; s[i],c[i]<=1E9

思路:贪心,从小到大,能合并就合并,结果肯定是最少的。注意map的使用,如何实现边遍历边删除。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)

void solve() {
    int n;
    cin >> n;
    map<int,int> mp;
    rep(i,1,n) {
        int s, c;
        cin >> s >> c;
        mp[s] += c;
    }
    int ans = 0;
    while (!mp.empty()) {
        auto [k,v] = *mp.begin();
        mp.erase(mp.begin());
        if (v > 1)
            mp[k*2] += v / 2;
        ans += v % 2;
    }
    cout << ans << "\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}
posted @ 2024-03-09 09:59  chenfy27  阅读(4)  评论(0编辑  收藏  举报