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