牛客练习赛50 C-tokitsukaze and Soldier

传送门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 }
View Code

 

posted @ 2019-08-25 17:13  然墨  阅读(128)  评论(0编辑  收藏  举报