您的位置:首页 > 其它

POJ 3614

2015-10-22 17:24 211 查看
POJ 3614

题目大意:奶牛美容:有C头奶牛日光浴,每头奶牛分别需要minSPF_i和maxSPF_i单位强度之间的阳光。现有L种防晒霜,分别能使阳光强度稳定为SPF_i,

其瓶数为cover_i。求最多满足多少头奶牛

贪心策略:现将奶牛的需求从小到大排列,防晒霜也这样排列,依次判断奶牛能否被防晒霜涂上,这样保证给了奶牛满足条件的最小需求。

#include <iostream>
#include <algorithm>
#include <queue>
#include <functional>
using namespace std;

pair<int, int> cow[2500 + 16];
pair<int, int> bottle[2500 + 16];
priority_queue<int, vector<int>, greater<int> > q;    // 优先级队列,小元素优先出队

///////////////////////////SubMain//////////////////////////////////
int main()
{
int C, L;
cin >> C >> L;
for (int i = 0; i < C; ++i)
{
cin >> cow[i].first >> cow[i].second;
}
for (int i = 0; i < L; ++i)
{
cin >> bottle[i].first >> bottle[i].second;
}
sort(cow, cow + C);
sort(bottle, bottle + L);
int cur = 0;    // 现在正等待涂防晒霜的奶牛的index
int result = 0;
for (int i = 0; i < L; ++i)
{
//只要奶牛非空并满足最小要求继续循环
while (cur < C && cow[cur].first <= bottle[i].first)
{
q.push(cow[cur].second);
++cur;
}

while (!q.empty() && bottle[i].second)
{
int maxSPF = q.top(); q.pop();
// “奶牛上限”比这一瓶的上限大,说明这头奶牛可以被涂上防晒霜
if (maxSPF >= bottle[i].first)
{
++result;
--bottle[i].second;
}
// else 这头奶牛不能被涂上,因为bottle是按SPF排过序的,没有比这瓶更小的SPF了
}
}
cout << result << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: