这是一道经典的贪心题
先看如何想到贪心 (这不明显吗,呃呃呃)
我们将牛的最大值与最小值抽象为线段,那这到题就变为线段的区间覆盖问题。
我们直接想如何可以使贪心最优,我们将线段的右端点排序,之后我们再选用一个值最大并且符合条件的防晒霜。
这样做为什么正确,我们可以感性理解。
每一头牛的贡献都为一,所以我们可以尽可能的用防晒霜,我们已经将每头牛按右端点排序,所以每次找可以用的防晒霜中最大的,可以使之后的选择更优
/***********************************************************
> file name: poj3614.cpp
> author: lan_m
> qq: 2867930696
> created time: 2021/9/19 14:52:53
> fighting for night
*******************************************************/
//#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int n,m;
pair<int,int>nod[2550];
pair<int,int>sp[2550];
int ans = 0;
int main () {
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i ++)
scanf("%d%d",&nod[i].first,&nod[i].second);
for (int i = 1;i <= m;i ++)
scanf("%d%d",&sp[i].first,&sp[i].second);
sort (nod+1,nod+1+n);
sort (sp+1,sp+1+m);
for (int i = n;i >= 1;i --) {
int l = nod[i].first;int r = nod[i].second;
int op,maxn = 0;
for (int j = 1;j <= m;j ++) {
if ( sp[j].second && sp[j].first <= r && sp[j].first >= l && sp[j].first > maxn) {
maxn = sp[j].first;
op = j;
}
}
if (maxn != 0) { sp[op].second --;ans++; }
}
printf("%d",ans);
return 0;
}