码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3614 Sunscreen (优先队列)

时间:2017-08-16 17:23:44      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:add   style   str   poj   writer   tab   取出   思路   clu   

题意:奶牛美容:有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 (优先队列)

标签:add   style   str   poj   writer   tab   取出   思路   clu   

原文地址:http://www.cnblogs.com/demian/p/7373530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!