背了重展的锅 de了两个小时,说实话stl真心救命
这道题主要就是优先选择贪心,同时比较s
把s从大到小排列 每次让其按顺序入队 下一个入队时考虑新加入的a[i].s因为每一次s递减所以维护起来十分方便
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+7;
priority_queue<int , vector<int >, greater<int > > pa;
struct node {
int v,s;
}a[maxn];
bool cmp(node a,node b)
{
return a.s>b.s;
}
signed main()
{
int n;
cin>>n;
for (int i=1;i<=n;++i)
{
cin>>a[i].v>>a[i].s;
}
sort(a+1,a+n+1,cmp);///反排序
int cnt=0,w=0,ans=0;
for (int i=1;i<=n;++i)
{
++cnt;
pa.push(a[i].v);
ans+=a[i].v;
while (cnt>a[i].s)///当前队元素大于入队s
{
--cnt;
ans=ans-pa.top();
pa.pop();
}
w=max(w,ans);
}
cout<<w<<endl;
return 0;
}


京公网安备 11010502036488号