贪心,对于【s】从大到小处理,对当前不满足【s】要求的按价值最小出队,则队列中元素为已处理过的元素在【s】下的最优要求。

#include<algorithm>
#include<cmath>
#include<numeric>
#include<vector>
#include<iomanip>
#include<queue>
typedef long long ll;
const double eps = 1e-4;
using namespace std; 
ll n;
vector<int> sor[100005];
priority_queue<int,vector<int>,greater<int>> q;//优先队列价值升序
int main()
{
	int n = 0; cin >> n;
	int s, v;
	for (int i = 1; i <= n; i++)
	{	
		cin >> v >> s;
		sor[s].push_back(v);
	}
	int sum = 0; int ans = 0;
	for (int i = n; i >= 1; i--)
	{
		for (auto a : sor[i])
		{
			sum += a;
			q.push(a);
		}
		while (q.size() > i)
		{
			sum -= q.top();
			q.pop();
		}
		ans = max(ans, sum);
	}
	cout << ans << endl;
	return 0;
}