intmain() { int T; while (cin >> T) { // 所有商品集合 vector<PII> vec; // 小根堆来存储最终出售的所有商品价格 priority_queue<int, vector<int>, greater<int>> down; while (T --) { int d, p; scanf("%d%d", &p, &d); vec.push_back({d, p}); }
// 对过期时间升序处理 sort(vec.begin(), vec.end());
for (int i = 0; i < vec.size(); ++ i) { int d = vec[i].first, p = vec[i].second; // 由于一天只能卖一件商品,堆中的商品数量大于当前商品的过期时间 // 所以堆中的商品需要舍弃最小利润的商品 down.push(p); if (down.size() > d) down.pop(); }
int sum = 0; while (!down.empty()) sum += down.top(), down.pop();