牛客练习赛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 }