先对cow按first从小到大排序
bottle按first从小到大排序
对于每个bottle,用优先队列保存所有cow的first比bottle的first低的值。然后取出cow的second较小的。
因为较大的即使这儿分配不到,还有机会再后面分到,而小的在后面可能就没有机会了。
/*
poj 3614
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define N 3000
int c,l;
pair<int ,int> a[N];
pair<int ,int> b[N];
int main(int argc, char const *argv[])
{
// freopen("input","r",stdin);
scanf("%d%d",&c,&l);
for(int i=0;i<c;i++)
scanf("%d%d",&a[i].first,&a[i].second);
for(int i=0;i<l;i++)
scanf("%d%d",&b[i].first,&b[i].second);
sort(a,a+c);
sort(b,b+l);
priority_queue<int ,vector<int >,greater<int> > que;
int count=0;
int j=0;
for (int i = 0; i < l; ++i)
{
while(j<c && a[j].first<=b[i].first)
{
que.push(a[j].second);
j++;
}
while(!que.empty() && b[i].second)
{
int tem=que.top();
que.pop();
if(tem<b[i].first)
continue;
count++;
b[i].second--;
}
}
printf("%d\n",count);
return 0;
}