#include<bits/stdc++.h> using namespace std; int main() { auto cmp = [](const pair<int, int> &p1, const pair<int, int> &p2)->bool { return p1.first < p2.first; }; int n; cin >> n; vector<pair<int, int>> nums; priority_queue<int, vector<int>, greater<int>> pq; for (int i = 0; i < n; i++) { int tmp1, tmp2; cin >> tmp1 >> tmp2; nums.emplace_back(tmp1, tmp2); } sort(nums.begin(), nums.end(), cmp); pq.push(nums[0].second); for (unsigned int i = 1; i < nums.size(); i++) { if (nums[i].first == nums[i - 1].first) { if (pq.top() < nums[i].second && pq.size() > nums[i].first) { pq.pop(); } } pq.push(nums[i].second); } int ans = 0; while (!pq.empty()) { ans += pq.top(); pq.pop(); } cout << ans << endl; } 大佬,这是我第一题的想法,按时间从小到大遍历,用一个小顶堆维护(里面是要选择的数据),如果时间不冲突,则都可以完成,如果时间有冲突的话,并且小顶堆的维护的数量已经达到了最大限度就看需要不需要出堆