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