题解:贪心
按s值从小到大排序,然后把每个士兵的v,s值压入优先队列
每次压入优先队列时,判断压入当前元素需要删除之前多少个元素,因为压入是根据v从小到大压入的,所以得到的就是最大的,记得压入和删除的时候,求和,以及取max
代码:
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; struct node { int v,s; } a[100010]; bool cmp(node x,node y) { return x.s>y.s; } priority_queue<int> q; long long n,ans,cnt; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d%d",&a[i].v,&a[i].s); sort(a+1,a+1+n,cmp); for(int i=1;i<=n;++i) { q.push(-a[i].v); cnt+=a[i].v; while(q.size()>a[i].s) cnt+=q.top(),q.pop(); ans=max(ans,tot); } cout<<ans<<endl; return 0; }