poj3614(Sunscreen)优先队列+贪心

Description

To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her hide with sunscreen when they're at the beach. Cow ihas a minimum and maximum SPF rating (1 ≤ minSPFi ≤ 1,000; minSPFi ≤ maxSPFi ≤ 1,000) that will work. If the SPF rating is too low, the cow suffers sunburn; if the SPF rating is too high, the cow doesn't tan at all........

The cows have a picnic basket with L (1 ≤ L ≤ 2500) bottles of sunscreen lotion, each bottle i with an SPF rating SPFi (1 ≤ SPFi ≤ 1,000). Lotion bottle i can cover coveri cows with lotion. A cow may lotion from only one bottle.

What is the maximum number of cows that can protect themselves while tanning given the available lotions?

Input

* Line 1: Two space-separated integers: C and L
* Lines 2..C+1: Line i describes cow i's lotion requires with two integers: minSPFi and maxSPFi
* Lines C+2..C+L+1: Line i+C+1 describes a sunscreen lotion bottle i with space-separated integers: SPFi and coveri

Output

A single line with an integer that is the maximum number of cows that can be protected while tanning

Sample Input

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

先对奶牛阳光强度最小值和防晒霜阳光强度升序排列,枚举每种防晒霜,将阳光强度最小值小于防晒霜阳光强度的奶牛入队,并按照最大值从小到大排列,取出依次最大值最小的奶牛,如果能用防晒霜,答案就加一。


#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <map>
#include <vector>
#include <list>
#include <set>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <functional>
#include <iomanip>
#include <limits>
#include <new>
#include <utility>
#include <iterator>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <ctime>
using namespace std;

pair<int, int> cow[2510], bottle[2510];

int main()
{
    int c, l;
    cin >> c >> l;
    for (int i = 0; i < c; ++i)
        scanf("%d%d", &cow[i].first, &cow[i].second);
    for (int i = 0; i < l; ++i)
        scanf("%d%d", &bottle[i].first, &bottle[i].second);
    sort(cow, cow+c);
    sort(bottle, bottle+l);
    priority_queue<int, vector<int>, greater<int> > q;
    int ans = 0, j = 0;
    for (int i = 0; i < l; ++i)
    {
        while (j < c && cow[j].first <= bottle[i].first)
            q.push(cow[j++].second);
        while (!q.empty() && bottle[i].second)
        {
            int x = q.top();
            q.pop();
            if (x < bottle[i].first)
                continue;
            ans++;
            bottle[i].second--;
        }
    }
    cout << ans << endl;
    return 0;
}


原文地址:https://www.cnblogs.com/godweiyang/p/12203958.html