题目
题目链接:http://poj.org/problem?id=3614
题目来源:《挑战》练习题
简要题意: C 头牛,有防晒值上下限,有
L 瓶防晒霜,给定防晒值和能给多少牛用,求最多防晒多少牛。数据范围: 1⩽C⩽2500;1⩽L⩽2500;1⩽minSPFi⩽maxSPFi⩽1000
题解
这题属于见过的类型,也知道是贪心,但是没反应过来,最后查了题解。
首先进行排序是肯定的,就按照pair去排序就行了。
处理的时候贪心去处理当前可以处理的上限最小的。
这里可以使用优先队列来搞,挑战上说了我还想其他的,简直白痴。
代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define fi first
#define se second
using namespace std;
typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
LL powmod(LL a,LL b, LL MOD) {LL res=1;a%=MOD;for(;b;b>>=1){if(b&1)res=res*a%MOD;a=a*a%MOD;}return res;}
// head
const int N = 2505;
PII a[N];
PII b[N];
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d%d", &a[i].fi, &a[i].se);
}
for (int i = 0; i < m; i++) {
scanf("%d%d", &b[i].fi, &b[i].se);
}
sort(a, a+n);
sort(b, b+m);
priority_queue<int> q;
int x = 0, cur, ans = 0;
for (int i = 0; i < m; i++) {
while (x < n && a[x].fi <= b[i].fi) {
q.push(-a[x++].se);
}
while (!q.empty() && b[i].se) {
cur = -q.top();
q.pop();
if (cur < b[i].fi) continue;
b[i].se--;
ans++;
}
}
printf("%d\n", ans);
return 0;
}