POJ 3614 优先队列

题意

传送门 POJ 3614

对防晒霜按 SPF 升序排序,每次处理当前防晒霜,就将所有 SPF 小于等于该 SPF 值的牛入队,此时入队的牛也是其后处理的防晒霜的可能涂抹对象。为了使防晒的牛数量最大,当前处理的防晒霜选择优先队列中 SPF 最大值最小的牛进行涂抹。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#define min(a,b)    (((a) < (b)) ? (a) : (b))
#define max(a,b)    (((a) > (b)) ? (a) : (b))
#define abs(x)    ((x) < 0 ? -(x) : (x))
#define INF 0x3f3f3f3f
#define delta 0.85
#define eps 1e-3
#define PI 3.14159265358979323846
#define MAX_C 2505
#define MAX_L 2505
using namespace std;
typedef pair<int, int> P;
int C, L;
P cow[MAX_C], lon[MAX_L];

int main(){
	while(~scanf("%d%d", &C, &L)){
		priority_queue<int, vector<int>, greater<int> > que;
		for(int i = 0; i < C; i++) scanf("%d%d", &cow[i].first, &cow[i].second);
		for(int i = 0; i < L; i++) scanf("%d%d", &lon[i].first, &lon[i].second);
		sort(cow, cow + C);
		sort(lon, lon + L);
		int res = 0;
		for(int i = 0, j = 0; i < L; i++){
			for(; j < C; j++){
				if(lon[i].first < cow[j].first) break;
				que.push(cow[j].second);
			}
			while(!que.empty() && lon[i].second > 0){
				int now = que.top(); que.pop();
				if(now < lon[i].first) continue;
				++res;
				--lon[i].second;
			}
		}
		printf("%d\n", res);
	}
	return 0;
}
发布了91 篇原创文章 · 获赞 1 · 访问量 1621

猜你喜欢

转载自blog.csdn.net/neweryyy/article/details/105118998
今日推荐