POJ 3614:Sunscreen 贪心+优先队列

Sunscreen
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 5378   Accepted: 1864

Description

To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her hide with sunscreen when they're at the beach. Cow i has a minimum and maximum SPF rating (1 ≤ minSPFi ≤ 1,000; minSPFi ≤ maxSPFi ≤ 1,000) that will work. If the SPF rating is too low, the cow suffers sunburn; if the SPF rating is too high, the cow doesn't tan at all........

The cows have a picnic basket with L (1 ≤ L ≤ 2500) bottles of sunscreen lotion, each bottle i with an SPF rating SPFi (1 ≤ SPFi ≤ 1,000). Lotion bottle i can cover coveri cows with lotion. A cow may lotion from only one bottle.

What is the maximum number of cows that can protect themselves while tanning given the available lotions?

Input

* Line 1: Two space-separated integers: C and L
* Lines 2..C+1: Line i describes cow i's lotion requires with two integers: minSPFi and maxSPFi 
* Lines C+2..C+L+1: Line i+C+1 describes a sunscreen lotion bottle i with space-separated integers: SPFi and coveri

Output

A single line with an integer that is the maximum number of cows that can be protected while tanning

Sample Input

3 2
3 10
2 5
1 5
6 2
4 1

Sample Output

2

有C头牛,每头牛有自己的承受阳光的最小值和最大值。现在有L瓶防晒霜,能够保持,一定数额的阳光。。。。然后还有一定的数量。问最多有多少头牛是被保护着的。

对牛进行排序,承受阳光小的放前面。

对防晒霜进行排序,保持阳光小的放在前面。

对每一种防晒液进行遍历,然后把能塞进来的牛即牛的最小值<防晒霜的值,都塞到优先队列中来。然后优先队列往外面是按照牛的最大值的递增顺序,先往外面弹小的,然后往外面弹大的。这样贪心就能够保证如果成功是最优的结果,失败了的话后面的防晒霜也不可能符合规格了。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
#include <map>
#pragma warning(disable:4996)
using namespace std;

struct no1 {
	int min_v;
	int max_v;
}cow[2505],lotion[2505];

int num_c, num_l;

bool cmp2(no1 x, no1 y)
{
	if (x.min_v == y.min_v)
	{
		return x.max_v < y.max_v;
	}
	else
	{
		return x.min_v < y.min_v;
	}
}

class cmp
{
public:
	bool operator()(int x, int y)
	{
		return x > y;
	}
};

priority_queue<int, vector<int>, cmp>qu;

int main()
{
	int i,j,ans;
	scanf("%d%d", &num_c, &num_l);

	for (i = 1; i <= num_c; i++)
	{
		scanf("%d%d", &cow[i].min_v, &cow[i].max_v);
	}
	for (i = 1; i <= num_l; i++)
	{
		scanf("%d%d", &lotion[i].min_v, &lotion[i].max_v);
	}
	sort(cow + 1, cow + num_c + 1, cmp2);
	sort(lotion + 1, lotion + num_l + 1, cmp2);

	j = 1; 
	ans = 0;
	
	for (i = 1; i <= num_l;i++)
	{
		while (j <= num_c && cow[j].min_v <= lotion[i].min_v)
		{
			qu.push(cow[j].max_v);
			j++;
		}
		while (qu.size() != 0 && lotion[i].max_v != 0)
		{
			int x = qu.top();
			qu.pop();
			if (x < lotion[i].min_v)
			{
				continue;
			}
			else
			{
				ans++;
				lotion[i].max_v--;
			}
		}
	}
	cout << ans << endl;
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-10-16 21:29  光速小子  阅读(142)  评论(0编辑  收藏  举报

导航