1. 程式人生 > >POJ 3614 Sunscreen (優先隊列)

POJ 3614 Sunscreen (優先隊列)

first tco min 答案 防曬霜 art sci sort 5-0

題意:奶牛美容:有C頭奶牛日光浴,每頭奶牛分別需要minSPF_i和maxSPF_i單位強度之間的陽光。現有L種防曬霜,分別能使陽光強度穩定為SPF_i,其瓶數為cover_i。求最多滿足多少頭奶牛

思路:

將奶牛按照陽光強度的最小值從小到大排序。將防曬霜也按照能固定的陽光強度從小到大排序。

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

然後優先隊列是小值先出,所以就可以將這些最大值中的最小的取出來。更新答案。

#include <iostream>  
#include <algorithm>  
#include <cstring>  
#include <cstdio>  
#include <map>  
#include <vector>  
#include <queue>  
#define MAXN 2555   
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;
}

POJ 3614 Sunscreen (優先隊列)