传送门:https://ac.nowcoder.com/acm/contest/1080/C
题意:
有n个人,每个人都有着自己的价值 Vi ,但是这些人都很孤僻,他们只能忍受最多 Si 个人聚在一起。请问如何选择可以使聚在一起的人的价值和最高。
思路:
1.首先会想到按每个人的 Si 来枚举,自然而然想到,每次指定一个 Si 最小的人,然后处理不低于TA底线的人。
2.如果每次都排序,可以预见会超时。所以我们考虑能不能用上之前的状态。
3.我们按每个人的容忍度 Si 从大到小排序。用一个小顶堆维护选择的人的V,向后枚举时,会pop原有的一部分堆顶。

1 #include<iostream>
2 #include<cstring>
3 #include<queue>
4 #include<algorithm>
5 #define ll long long
6 using namespace std;
7 const int N=100010;
8 struct node
9 {
10 ll v,s;
11 friend bool operator <(node x,node y)
12 {
13 return x.s>y.s;
14 }
15 }a[N];
16 priority_queue<int,vector<int>,greater<int> > q;
17 int main()
18 {
19 ios::sync_with_stdio(false);
20 int n;
21 ll sum=0,ans=0;
22 cin>>n;
23 for(int i=0;i<n;i++)
24 cin>>a[i].v>>a[i].s;
25
26 sort(a,a+n);
27 for(int i=0;i<=n;i++)
28 {
29 q.push(a[i].v);
30 sum+=a[i].v;
31 while(q.size()>a[i].s)
32 {
33 sum-=q.top();
34 q.pop();
35 }
36 ans=max(ans,sum);
37 }
38 cout<<ans<<endl;
39 return 0;
40 }
