题面:有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;
}
标签:int,合并,abc323D,ans,泥巴,define,mp
From: https://www.cnblogs.com/chenfy27/p/18062302