POJ 3614 Sunscreen (优先队列)

Posted Point

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3614 Sunscreen (优先队列)相关的知识,希望对你有一定的参考价值。

题意:奶牛美容:有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 (优先队列)的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3614 Sunscreen (优先队列)

Poj 3614-Sunscreen

POJ3614 Sunscreen 贪心

Sunscreen POJ - 3614(贪心)

poj3614 Sunscreen贪心

POJ 3614 Sunscreen