poj 3614 Sunscreen 贪心 优先队列

来源:互联网 发布:linux合并同名文件夹 编辑:程序博客网 时间:2024/04/29 01:31

题目

题目链接:http://poj.org/problem?id=3614

题目来源:《挑战》练习题

简要题意:C头牛,有防晒值上下限,有L瓶防晒霜,给定防晒值和能给多少牛用,求最多防晒多少牛。

数据范围:1C2500;1L2500;1minSPFimaxSPFi1000

题解

这题属于见过的类型,也知道是贪心,但是没反应过来,最后查了题解。

首先进行排序是肯定的,就按照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 secondusing 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;}// headconst 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;}
0 0
原创粉丝点击