题目链接:
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 }