poj 3614 Sunscreen(priority_queue && Greedy)

Sunscreen
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 7371 Accepted: 2602

Description

To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her hide with sunscreen when they’re at the beach. Cow i has a minimum and maximum SPF rating (1 ≤ minSPFi ≤ 1,000; minSPFi ≤ maxSPFi ≤ 1,000) that will work. If the SPF rating is too low, the cow suffers sunburn; if the SPF rating is too high, the cow doesn’t tan at all……..

The cows have a picnic basket with L (1 ≤ L ≤ 2500) bottles of sunscreen lotion, each bottle i with an SPF rating SPFi (1 ≤ SPFi ≤ 1,000). Lotion bottle i can cover coveri cows with lotion. A cow may lotion from only one bottle.

What is the maximum number of cows that can protect themselves while tanning given the available lotions?

Input

  • Line 1: Two space-separated integers: C and L
  • Lines 2..C+1: Line i describes cow i’s lotion requires with two integers: minSPFi and maxSPFi
  • Lines C+2..C+L+1: Line i+C+1 describes a sunscreen lotion bottle i with space-separated integers: SPFi and coveri

Output

A single line with an integer that is the maximum number of cows that can be protected while tanning

Sample Input

3 2
3 10
2 5
1 5
6 2
4 1

Sample Output

2

题意

每一个牛有一个照晒强度的承受区间,而存在若干个不同的防晒霜,可以将牛的防晒强度固定到一个值,如何合理使用这些防晒霜,使得牛在承受区间的数量的最大化。

抽象

给定若干个区间,和数量不等的若干个固定值,使得尽量多的每一个区间内都有一个固定的值。

思路

果断贪心。。。
使尽量小的固定值 放在 尽量小的区间中。为减少复杂度,应用优先队列,一个个的固定值考虑,将符合的区间的右端点的值放在优先队列中,右端点值小的先使用。符合条件的,ans++;

代码

/*===============================================================
*   Copyright (C) 2016 All rights reserved.
*   
*   Filename: A.cpp
*   Author:   gsh
*   Created_time:2016/8/21 星期日 10:56:50
*   Problem_tags: pq;
*   Problem_keyword:
================================================================*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int maxn = 2550;
typedef pair<int, int> P;
priority_queue< int, vector<int>, greater<int> > pq;
P c[maxn], l[maxn];
int main()
{
#ifdef LOCAL
    freopen("A.in","r",stdin);
    freopen("A.out","w",stdout);
#endif
    int n, m;
    while(cin >> n >> m)
    {
        for(int i = 0; i < n; i++)
            cin >> c[i].first >> c[i].second;
        for(int i = 0; i < m; i++)
            cin >> l[i].first >> l[i].second;
        sort(c, c+n);
        sort(l, l+m);
        int j = 0, ans = 0;
        for(int i = 0; i < m; i++)
        {
            while(j < n && c[j].first <= l[i].first)
            {
                pq.push(c[j].second);
                j++;
            }
            while(!pq.empty() && l[i].second)
            {
                int x = pq.top();
                pq.pop();
                if(x < l[i].first) continue;
                ans++;
                l[i].second--;
            }
        }
        cout << ans << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值