防晒贪心 + 平衡树
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 }
以上是关于防晒贪心 + 平衡树的主要内容,如果未能解决你的问题,请参考以下文章