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