zoukankan      html  css  js  c++  java
  • 防晒【贪心 + 平衡树】


    image

    证明不会: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 }
    追求吾之所爱
  • 相关阅读:
    KNN算法
    从malloc中窥探Linux内存分配策略
    ECC校验原理以及在Nand Flash中的应用
    周大福、周六福、周生生等区分
    USB时钟为什么是48MHz
    NFS网络操作系统介绍以及相关应用
    办公技巧
    嵌入式设备中使用短信服务
    Android App测试要点
    Excel中 设置使得每行的颜色不一样
  • 原文地址:https://www.cnblogs.com/rstz/p/12702399.html
Copyright © 2011-2022 走看看