POJ 3614 Sunscreen

问题描述:有C头奶牛进行日光浴,第i头奶牛需要minSPF[i]到maxSPF[i]单位强度之间的阳光。每头奶牛在日光浴前必须涂防晒霜,防晒霜有L种,涂上第i种之后,身体接收到的阳光强度就会稳定为SPF[i],第i种防晒霜有cover[i]瓶。求最多可以满足多少头奶牛进行日光浴。

题解:本题运用这样一个贪心策略,按照每个奶牛的最小享受值降序排列。对于每一头奶牛,遍历所有的防晒霜,找到一个满足享受范围的防晒霜的SPF值最大的防晒露。

思考 为什么这个策略是正确的? 由于前一头奶牛的min 小于后一头奶牛的 min 所以如果有瓶防晒露满足 后一头奶牛的需求。那么 存在以下两种情况:
1 两头牛都可以用 2 min 大的奶牛能用 min小的不能用
所以尽量选大的,能让后面的奶牛有满足的可选。
详见代码:

#include<bits/stdc++.h>
 using namespace std;
const int MAXN=5000;
struct cow{
   int minSPF,maxSPF;
}c[MAXN];
int SPF[MAXN],cover[MAXN];
int L,C;
int J=0;
bool myc(cow a,cow b) { return a.minSPF>b.minSPF; }
int main()
{
   cin>>C>>L;
   for(int i=1;i<=C;i++) scanf("%d %d",&c[i].minSPF,&c[i].maxSPF);
   sort(c+1,c+C+1,myc);
   for(int i=1;i<=L;i++) scanf("%d %d",&SPF[i],&cover[i]);
   for(int i=1;i<=C;i++)
   {
   	int x=c[i].minSPF,y=c[i].maxSPF;
   	int use=-1,num;
	for(int j=1;j<=L;j++)
   	 if(SPF[j]>=x && SPF[j]<=y && cover[j] && SPF[j]>use )  use=SPF[j],num=j;	
   	if(use!=-1) { J++; cover[num]--;} 
   }
   cout<<J;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值