题目链接:

https://ac.nowcoder.com/acm/problem/50439

思路:

(新手菜鸡开始都没想着用队列QAQ)首先以每个士兵的要求s为标准从大到小排序,然后遍历,之后当队列里的人数小于当前士兵要求人数时,便把士兵放进最小值优先级队列,反之就弹出队列里能力值最小的人(即队头),直到符合条件。遍历过程中记录最大值。

解题代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <string>
 6 #include <cstring>
 7 #include <map>
 8 #include <queue>
 9 using namespace std;
10 const long long maxn = 1e5 + 7;
11 typedef long long ll;
12 struct people
13 {
14     int v;
15     int s;
16 }p[100010];
17 priority_queue <int , vector<int> , greater<int> > p2 ; //最小值优先级队列
18 bool cmp(people a,people b)
19 {
20     return a.s > b.s;
21 }
22 int main()
23 {
24     int n;
25     ll sum = 0,maxnum = 0;
26     cin >> n;
27     for(int i = 1;i <= n;i++)
28     {
29         cin >> p[i].v >> p[i].s;
30     }
31     sort(p+1,p+1+n,cmp);
32     for(int i = 1;i <= n;i++)
33     {
34         while(p2.size() >= p[i].s)  //一旦队列里的人数不小于当前士兵要求时,弹出队列里价值最小的人
35         {
36             sum -= p2.top();
37             p2.pop();
38         }
39         sum += p[i].v;
40         p2.push(p[i].v);
41         maxnum = max(maxnum,sum);
42     }
43     cout << maxnum << endl;
44 
45     return 0;
46 }