1. 程式人生 > >POJ 3614 Sunscreen 優先佇列 貪心

POJ 3614 Sunscreen 優先佇列 貪心

題意

有C個奶牛去晒太陽 (1 <=C <= 2500),每個奶牛各自能夠忍受的陽光強度有一個最小值和一個最大值,太大就晒傷了,太小奶牛沒感覺。

而剛開始的陽光的強度非常大,奶牛都承受不住,然後奶牛就得塗抹防晒霜,防晒霜的作用是讓陽光照在身上的陽光強度固定為某個值。

那麼為了不讓奶牛燙傷,又不會沒有效果。

給出了L種防晒霜。每種的數量和固定的陽光強度也給出來了

每個奶牛隻能抹一瓶防晒霜,最後問能夠享受晒太陽的奶牛有幾個。

那麼將奶牛按照陽光強度的最小值從小到大排序。

將防晒霜也按照能固定的陽光強度從小到大排序

從最小的防晒霜列舉,將所有符合  最小值小於等於該防晒霜的 奶牛的 最大值 放入優先佇列之中。

然後優先佇列是小值先出

所以就可以將這些最大值中的最小的取出來。更新答案。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <map>
#include <vector>
#include <queue>
#define MAXN 2555
#define INF 1000000007
using namespace std;
int C, L;
typedef pair<int, int> P;
priority_queue<int, vector<int>, greater<int> > q;
P cow[MAXN], bot[MAXN];
int main()
{
    scanf("%d%d", &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", &bot[i].first, &bot[i].second);
    sort(cow, cow + C);
    sort(bot, bot + L);
    int j = 0, ans = 0;
    for(int i = 0; i < L; i++)
    {
        while(j < C && cow[j].first <= bot[i].first)
        {
            q.push(cow[j].second);
            j++;
        }
        while(!q.empty() && bot[i].second)
        {
            int x = q.top();
            q.pop();
            if(x < bot[i].first) continue;
            ans++;
            bot[i].second--;
        }
    }
    printf("%d\n", ans);
    return 0;
}