题目大意:有C头牛要去晒日光浴,每头牛有自己的minSPF和maxSPF,他们需要这两者之间的强度的阳光,现在有L种防晒霜,每种防晒霜可以把阳光强度稳定在SPF_i,有cover_i瓶。一头牛至多只能用一瓶防晒霜。
分析:首先,将牛按minSPF升序,防晒霜按SPF_i升序,把当前的防晒霜抹给minSPF小于等于SPF_i的牛中maxSPF最小的。因为maxSPF越大(假设minSPF相同),可选择的防晒霜越多。至于怎么去maxSPF最小,可以用一个优先队列来维护最小值。
代码:
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 3000;
pair<int, int> c[maxn];
pair<int, int> s[maxn];
priority_queue<int, vector<int>, greater<int> > pq; //元素越小,越先出队
int n, m;
int main() {
while(~scanf("%d%d", &n, &m)) {
for(int i = 0; i < n; i++)
scanf("%d%d", &c[i].first, &c[i].second);
for(int i = 0; i < m; i++)
scanf("%d%d", &s[i].first, &s[i].second);
sort(c, c+n);
sort(s, s+m);
int cur = 0;
int ans = 0;
for(int i = 0; i < m; i++) {
while(cur < n && c[cur].first <= s[i].first) {
pq.push(c[cur].second);
cur++;
}
while(!pq.empty() && s[i].second) {
int x = pq.top(); pq.pop();
if(s[i].first <= x) { //当前这种防晒霜的SPF小于等于当前最大的奶牛maxSPF
ans++;
s[i].second--;
}
//否则的话,当前这种防晒霜不能无法涂给之前所有的牛
}
}
printf("%d\n", ans);
}
return 0;
}