[贪心] 防晒

防晒

有C头奶牛进行日光浴,第i头奶牛需要minSPF[i]到maxSPF[i]单位强度之间的阳光。

每头奶牛在日光浴前必须涂防晒霜,防晒霜有L种,涂上第i种之后,身体接收到的阳光强度就会稳定为SPF[i],第i种防晒霜有cover[i]瓶。

求最多可以满足多少头奶牛进行日光浴。

输入格式
第一行输入整数C和L。

接下来的C行,按次序每行输入一头牛的minSPF和maxSPF值,即第i行输入minSPF[i]和maxSPF[i]。

再接下来的L行,按次序每行输入一种防晒霜的SPF和cover值,即第i行输入SPF[i]和cover[i]。

每行的数据之间用空格隔开。

输出格式
输出一个整数,代表最多可以满足奶牛日光浴的奶牛数目。

数据范围
1≤C,L≤2500,
1≤minSPF≤maxSPF≤1000,
1≤SPF≤1000
输入样例:

3 2
3 10
2 5
1 5
6 2
4 1

输出样例:

2


两个贪心的思路。
1.将所有奶牛按照 minSPF 从大到小的顺序排序,然后依次考虑每头奶牛;
对于每头奶牛,扫描当前所有能用的防晒霜,选择 SPF 值最大的防晒霜来用;

2.将所有奶牛按照 maxSPF 从小到大的顺序排序,然后依次考虑每头奶牛;
对于每头奶牛,扫描当前所有能用的防晒霜,选择 SPF 值最小的防晒霜来用;


#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
struct node {
    int minn, maxx;
};
bool cmp (node a, node b) {
    return a.maxx < b.maxx;
}
vector<node > cp;
map<int, int>cover;
int main () {
    int c, l, a, b;
    cin >> c >> l;
    for (int i = 1; i <= c; i++) {
        cin >> a >> b;
        cp.push_back({a, b});
    }
    sort(cp.begin(), cp.end(), cmp);
    for (int i = 1; i <= l; i++) {
        cin >> a >> b;
        cover[a] += b;
    }
    int ans = 0;
    for (int i = 0; i < c; i++) {
        int minn = cp[i].minn, maxx = cp[i].maxx;
        int p = -1;
        map<int, int>::iterator it = cover.begin();
        for (;it != cover.end(); it ++) {
            if (it->first >= minn && it->first <= maxx && it->second > 0) {
                p = it->first;
                break;
            }
        }
        if (p != -1) {
            ans ++;
            cover[p]--;
        }
    }
    cout << ans;
    return 0;
}


上一篇:导出 VuePress构建的网站为 PDF


下一篇:python爬虫简单代码爬取郭德纲单口相声