POJ 3614 Sunscreen

题意:

n 有c头牛晒太阳,每头牛都有一个能承受辐射的范围 (min~max ) ,现在有l 种防晒霜,每种防晒霜都能将辐射值固定在spf,每种防晒霜都有一定的数量num。每头牛用最多一种防晒霜,问能满足多少头牛。
思路:
贪心。先将每头牛按min值从小到大排序,将防晒霜按spf值从小到大排,然后枚举每种防赛霜,将所有符合min<=spf的牛的max丢进最小值优先队列里,然后每次取出一只max最小的牛去涂,这样得到的结果最大。
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;

const int MAX=2505;
int n,m;

struct Node{
	int l,r;
}a[MAX];

struct SPF{
	int spf,num;
}b[MAX];

struct cmp{
	bool operator () (int &x,int &y){
		return x>y;
	}
};

bool cmp1(Node x,Node y){
	return x.l<y.l;
}

bool cmp2(SPF x,SPF y){
	return x.spf<y.spf;
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a[i].l,&a[i].r);
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&b[i].spf,&b[i].num);
	}
	sort(a+1,a+1+n,cmp1);
	sort(b+1,b+1+m,cmp2);
	priority_queue<int,vector<int>,cmp> Q;
	int ans=0,j=1;
	for(int i=1;i<=m;i++){
		while(a[j].l<=b[i].spf&&j<=n){
			Q.push(a[j].r);
			j++;
		}
		while(b[i].num&&!Q.empty()){
			int t=Q.top();
			Q.pop();
			if(t>=b[i].spf){
				b[i].num--;
				ans++;
			}
		}
	}
	printf("%d\n",ans);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值