110. 防晒

原题链接: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;
}
原文地址:https://www.cnblogs.com/hnkjdx-ssf/p/14285399.html