poj3164 Sunscreen(优先队列+贪心)

3 篇文章 0 订阅
Sunscreen
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 4205 Accepted: 1459

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

Source

题目大意:每个牛有个防晒系数,有个最小值和最大值,防晒霜有防晒系数和数量,涂上可以避免晒伤,防晒系数太大的话就感受不到太阳,问涂上防晒霜最多能有多少只牛能晒上太阳。
思路:牛和防晒霜都排序,将防晒系数进入的优先队列,从小到大,牛的防晒能力小的优先用防晒系数小的防晒霜,这样就能充分的利用防晒霜,系数大的用到后边的的牛身上,不让其浪费。
/*
今天又做才感觉到貌似以前看过的感觉,只是没有A掉。竟然没有一点印象。。。
Time:2014-11-17 21:17
*/
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int MAX=2500;
struct Node{
	int first,second;
	bool operator <(const Node &a)const{
		return second>a.second;
	}
}cow[MAX],bot[MAX];
//奶牛的两个值为最高值和最低值,瓶子是防晒值和数量 
bool cmp(Node a,Node b){
	return a.first<b.first;
}
int main(){
	int C,L;
	int i,j;
	scanf("%d%d",&C,&L);
	for(i=0;i<C;i++){
		scanf("%d%d",&cow[i].first,&cow[i].second);
	}
	for(i=0;i<L;i++){
		scanf("%d%d",&bot[i].first,&bot[i].second);
	}
	sort(cow,cow+C,cmp);
	sort(bot,bot+L,cmp);
	priority_queue<Node>pq;
	int cur=0,result=0;
	for(i=0;i<L;i++){
		while(cur<C&&bot[i].first>=cow[cur].first){
			pq.push(cow[cur++]);//把奶牛的防晒值从小到大,排序,比防晒霜小就入队 
		}
		int maxSPF;
		while(!pq.empty()&&bot[i].second){//用掉的总是最小防晒系数的防晒霜 
			maxSPF=pq.top().second;pq.pop();
			if(maxSPF>=bot[i].first){
				result++;
				bot[i].second--;
			}//else如果防晒霜比最高值大不能用,说明这个牛不能晒太阳,英文后边的防晒霜防晒系数更大
		}
	}
	printf("%d\n",result);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值