防晒贪心 + 平衡树

Posted rstz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防晒贪心 + 平衡树相关的知识,希望对你有一定的参考价值。


技术图片

证明不会:yxc说要用匈牙利算法,来确定增广路径;

算法步骤:

1.将牛按minspf从大到小排序

2.每次取出满足当前条件,最大的spf。


因为是按开始从大到小排序,所以假设x, y防晒,spfs[x] < spfs[y], 那么可能后面的牛能用到x,y,或者只用到x,或者都用不上。因为后面的牛可能可以用x,所以当前这头牛应该选择在它适合的范围最大的spf。

所以结论成立。

代码

  1 #include <iostream>
  2 #include <algorithm>
  3 #include <map>
  4 using namespace std;
  5 
  6 typedef pair<int, int> PII;
  7 const int N = 2500 + 5;
  8 PII cows[N];
  9 int main(){
 10     int c,l;
 11     cin >> c >> l;
 12     map<int, int> spfs;
 13     for(int i = 0; i < c; ++ i)cin >> cows[i].first >> cows[i].second;
 14     for(int i = 0; i < l; ++ i){
 15         int spf, cover;
 16         cin >> spf >> cover;
 17         spfs[spf] += cover;
 18     }
 19     sort(cows, cows+c);
 20     int res = 0;
 21     spfs[0] = spfs[1001] = c; //auto spf = spfs.upper_bound(cows[i].second);
 22                             //这句话是在spfs中查找大于cows[i].second的最小元素
 23                             //,设置哨兵是为了让这条语句不返回空。
 24     for(int i = c-1; i >= 0; -- i){
 25         auto spf = spfs.upper_bound(cows[i].second);//找出第一个大于它的数
 26         spf--;
 27         if(spf->first >= cows[i].first){
 28             res++;
 29             if(--spf->second == 0)
 30                 spfs.erase(spf);
 31         }
 32     }
 33     cout << res << endl;
 34     return 0;
 35 }

以上是关于防晒贪心 + 平衡树的主要内容,如果未能解决你的问题,请参考以下文章

codefoeces problem 671D——贪心+启发式合并+平衡树

南开OJ2264节操大师(贪心+二分+并查集/平衡树)

一些贪心题的题解

poj 3614 奶牛美容问题 优先队列

洛谷 [P2887] 防晒霜

P2887 [USACO07NOV]防晒霜Sunscreen