问题描述:有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;
}