POJ3614防晒霜Sunscreen【贪心】

>Description
有C(1≤C≤2500)只奶牛在晒太阳前必须涂一下防晒霜。
奶牛们都有一个能接受太阳热度的最低等级和最高等级,它们承受的太阳热度不能低于最低等级,也不能高于最高等级。

有L(1≤L≤2500)种防晒霜,每种都有一个防晒指数SPFi(1≤SPFi≤1,000),并且每种防晒霜都有限定的数量。一头奶牛只能用一瓶防晒霜,用了防晒霜以后,这头奶牛接受的太阳热度就强行变成了防晒霜的防晒指数。

给定可用的防晒霜,问可以保护自己的最大奶牛数量是多少?


>Input
第1行:两个以空格分隔的整数:C和L.
第2…C + 1行:第i行描述奶牛能接受的太阳热度的两个整数:minSPFi和maxSPFi
第C + 2…C + L + 1行:描述了一个具有空格分隔整数的防晒乳液瓶:SPFi(等级)和coveri(数量)

>Output
带有整数的单行,该整数是可以保护的最大奶牛数


>Sample Input
3 2
3 10
2 5
1 5
6 2
4 1

>Sample Output
2


>解题思路
贪心思想:把奶牛们按照minn承受的最低等级从大到小排序,然后枚举每一个奶牛,在每头奶牛能使用的防晒霜里找到防晒程度最大的那一瓶给它使用,当然前提是这种防晒霜还有剩余的瓶数。


>代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct ooo
{
	int maxn,minn;
}a[2505]; //奶牛
struct ooo2
{
	int sum,n;
}s[2505]; //防晒霜
int c,l,ans;
bool cmp(ooo aa,ooo bb)
{
	if(aa.minn!=bb.minn) return aa.minn>bb.minn;
	return aa.maxn>bb.maxn;
} //奶牛排序
bool cmp2(ooo2 aa,ooo2 bb){return aa.sum<bb.sum;} //防晒霜排序
int main()
{
	scanf("%d%d",&c,&l);
	for(int i=1;i<=c;i++) scanf("%d%d",&a[i].minn,&a[i].maxn);
	sort(a+1,a+1+c,cmp);
	for(int i=1;i<=l;i++) scanf("%d%d",&s[i].sum,&s[i].n);
	sort(s+1,s+1+l,cmp2);
	for(int i=1;i<=c;i++)
	 for(int j=l;j>=1;j--) //从大的开始搜
	  if(s[j].sum<=a[i].maxn&&s[j].sum>=a[i].minn&&s[j].n>0)
	  {
	  	ans++; s[j].n--; break;
	  }
	printf("%d",ans);
	return 0;
}

你可能感兴趣的:(贪心;暴力;模拟)