原题链接:110. 防晒
解题思路
贪心+排序
我们首先将奶牛可以承受的最小值,递减排序,也就是降序排列,然后将防晒霜固定的值,递减排序,还是降序排列.
对于每一个头奶牛而言,当然是要选择目前来说满足条件的最差的防晒霜,什么最差的定义,就是选择满足奶牛条件的SPF最大的那一瓶防晒霜.
注意:降序排序,保证对于每一头牛而言,它用的是,可以使用的最差的防晒霜,因为值越小的防晒霜,有可能让更多的牛使用.而升序排列,就恰好反了.
样例代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
using namespace std;
#define MAXN 20000
int n,m,ans;
pair<int,int> cow[MAXN],lotion[MAXN];
priority_queue<int> q;
void process(){
int i,i1;
while(!q.empty()) q.pop();
sort(cow,cow+n);
sort(lotion,lotion+m);
for(ans=i=i1=0;i<m;i++){
while((i1<n)&&(cow[i1].first<=lotion[i].first))
q.push(-cow[i1++].second);
while((!q.empty())&&(-(q.top())<lotion[i].first))
q.pop();
while((!q.empty())&&(lotion[i].second--)){
ans++;
q.pop();
}
}
}
int main(){
int i,j;
freopen("tanning.in","r",stdin);
freopen("tanning.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d%d",&cow[i].first,&cow[i].second);
for(i=0;i<m;i++)
scanf("%d%d",&lotion[i].first,&lotion[i].second);
ans=0;
process();
printf("%d
",ans);
return 0;
}