背了重展的锅 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; }