当前位置:   article > 正文

备战蓝桥杯---数据结构与STL应用(入门4)

备战蓝桥杯---数据结构与STL应用(入门4)

本专题主要是关于利用优先队列解决贪心选择上的“反悔”问题

话不多说,直接看题:

下面为分析:

很显然,我们在整体上以s[i]为基准,先把士兵按s[i]排好。然后,我们先求s[i]大的开始,即规定选人数不超过s[i]的士兵,下面为图解:

下面为AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct node{
  4. long long v,s;
  5. }a[1000100];
  6. long long n;
  7. bool cmp(node a,node b){
  8. return a.s>b.s;
  9. }
  10. signed main(){
  11. cin>>n;
  12. for(int i=1;i<=n;i++){
  13. scanf("%lld%lld",&a[i].v,&a[i].s);
  14. }
  15. sort(a+1,a+1+n,cmp);
  16. priority_queue<long long,vector<long long>,greater<long long> > q;
  17. long long cap=a[1].s,sum=a[1].v,max1=-1;
  18. q.push(a[1].v);
  19. for(int i=2;i<=n;i++){
  20. if(a[i].s==cap){
  21. q.push(a[i].v);
  22. sum+=a[i].v;
  23. if(q.size()>cap){
  24. sum-=q.top();
  25. q.pop();
  26. }
  27. }
  28. else{
  29. cap=a[i].s;
  30. q.push(a[i].v);
  31. sum+=a[i].v;
  32. while(q.size()>cap){
  33. sum-=q.top();
  34. q.pop();
  35. }
  36. }
  37. max1=max(max1,sum);
  38. }
  39. cout<<max1;
  40. }

再来一道类似的:

下面为分析:

类似的,我们指定一个基准,我们按deadline升序排好,从小的开始枚举。

如果前面的时间加当前所需没超当前建筑的deadline,我们就添加。

否则,我们用它与前面所需时间max的比,如果比他小就替换。

下面为AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. int n;
  5. struct node{
  6. int t1,t2;
  7. }a[150010];
  8. bool cmp(node a,node b){
  9. return a.t2<b.t2;}
  10. signed main(){
  11. scanf("%d",&n);
  12. for(int i=1;i<=n;i++) scanf("%d%d",&a[i].t1,&a[i].t2);
  13. sort(a+1,a+n+1,cmp);
  14. priority_queue<int> q;
  15. int dead=-1,cnt=0,sum=0;
  16. for(int i=1;i<=n;i++){
  17. q.push(a[i].t1);
  18. cnt++;
  19. sum+=a[i].t1;
  20. if(a[i].t2!=dead) dead=a[i].t2;
  21. if(sum>dead){
  22. sum-=q.top();
  23. cnt--;
  24. q.pop();
  25. }
  26. }
  27. cout<<cnt;
  28. }

让我们总结一下,本专题围绕利用优先队列解决贪心选择上的“反悔”(或优化)问题(常用于固定枚举一个基准值)

最后,举个形象的例子:我们的成长就是从一开始的幼稚不断地经历岁月的打磨,见识的增长,不断优化,最终走向成熟。

希望可以和大家一起继续前行!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号