6.10每日一题题解

tokitsukaze and Soldier

涉及知识点:

  • 优先队列

solution:

  • (首先,我们看到这个题,肯定干第一反应就是结构体加排序,但是仔细读完题我们发现)
  • (第一,他有一个关于人数的限制的问题)
  • (第二,他需要我们找打最大的“战力值”)
  • (所以结构体加排序的方法是行不通的,那么我们怎么做呢)
  • (因为首先要满足所有选的人的s[i],所以我们肯定能想到用一种动态的方法来进行判断,这个方法就是优先队列)
  • (为什么用这个呢,因为优先队列即可以排序,也可以动态的保证人数问题,所以我们选用它)

std:

#include <bits/stdc++.h>
using namespace std;
//using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int inf=0x7fffffff;
const int N =5e5+10;
const int maxn = 200010;
ll n , k ;
pll pr[100010];
ll res =0 ;
ll cmp(pair<int , int > a , pair < int , int >  b){
    return a.second > b.second;
}
priority_queue<ll , vector<ll >  , greater<ll > > qe;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >>n;
    for(int i=0 ;i<n;i++){
    cin >>pr[i].first >> pr[i].second;
    }
    sort(pr,pr+n ,cmp);
    ll ma =0 ;ll sum =0 ;
    for(int i=0;i<n;i++){
        while(qe.size() >= pr[i].second){
            ma -= qe.top();
            qe.pop();
        }
        qe.push(pr[i].first);
        ma +=pr[i].first;
        sum = max(sum ,ma);
    }
    cout<<sum<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/QFNU-ACM/p/13089818.html