POJ3614 贪心+优先队列

题意:m头牛每头牛有minspf和maxspf,n种spf为spf[i]的防晒霜每种l[i]瓶,尽可能给数量多的牛涂防晒霜,每头牛最多涂一瓶。

思路:贪心想法,实现是每次取出minspf<=spf[i]的牛加入优先队列中,优先队列以牛的maxspf为优先,给maxspf>=spf[i]且maxspf从小开始取的牛涂(优先队列)。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
pair<int,int> cow[2510];
pair<int,int> bot[2510];
struct cmp {
    bool operator () (pair<int,int>  a,pair<int,int>  b) {
        return a.second>b.second;
    }
};

priority_queue<pair<int,int>,vector<pair<int,int> >,cmp> pq;
int main() {
    int c,l,smin,smax,cnt=0;
    scanf("%d%d",&c,&l);
    for(int i=0;i<c;i++) {
        scanf("%d%d",&cow[i].first,&cow[i].second);
    }
    sort(cow,cow+c);
    for(int i=0;i<l;i++) {
        scanf("%d%d",&bot[i].first,&bot[i].second);
    }
    sort(bot,bot+l);
    pair<int,int> temp;
    int j=0;
    for(int i=0;i<l;i++) {
        while(j<c &&cow[j].first<=bot[i].first) {
            pq.push(cow[j]);
            j++;
        }
        while(bot[i].second>0 && !pq.empty()) {
            temp=pq.top();
            pq.pop();
            if(temp.second>=bot[i].first) {
                cnt++;
                bot[i].second--;
            }    
        } 
    }
    printf("%d
",cnt);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/LinesYao/p/5672171.html