POJ 3614 Sunscreen 優先佇列 貪心
阿新 • • 發佈:2018-12-29
題意
有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; }