题意:
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;
}