abc323D 合併泥巴

chenfy27發表於2024-03-09

題面:有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;
}