题意:每个奶牛有个防晒系数(spf)范围,有若干个防晒露可以分别将spf降到某个值,但是每个防晒露都有次数限制,输出最多可以保护几个奶牛。
先通过每个奶牛的minspf进行从小到大排序,并将防晒露的spf值从小到大排序,用优先队列对奶牛的maxspf维护,顶层为最小值,对于每个防晒露的spf值,取minspf小于等于这个值的放进优先队列,再从队列中取值直到该防晒露用完,依次循环,最后输出最大值即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<set>
#include<bitset>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<utility>
#define INF 1000000007
#define inf 100000000000000000
using namespace std;
typedef long long ll;
int c,l,i,j,ans=0;
struct node{
int mi,ma;
bool operator<(const node &a)const{
return ma>a.ma;
}
}cow[2505],ff;
struct nod{
int spf,co;
}ss[2505];
bool cmp1(node a,node b)
{
return a.mi<b.mi;
}
bool cmp2(nod a,nod b)
{
return a.spf<b.spf;
}
priority_queue<node>que;
int main()
{
scanf("%d%d",&c,&l);
for(i=0;i<c;i++)scanf("%d%d",&cow[i].mi,&cow[i].ma);
for(i=0;i<l;i++)scanf("%d%d",&ss[i].spf,&ss[i].co);
sort(cow,cow+c,cmp1);
sort(ss,ss+l,cmp2);
j=0;
for(i=0;i<l;i++)
{
for(;j<c;j++)
{
if(cow[j].mi<=ss[i].spf)que.push(cow[j]);
else break;
}
while(!que.empty()&&ss[i].co)
{
ff=que.top();que.pop();
if(ff.ma>=ss[i].spf)
{
ans++;ss[i].co--;
}
}
}
printf("%d\n",ans);
return 0;
}