POJ :3614-Sunscreen

传送门:http://poj.org/problem?id=3614

Sunscreen

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 10136 Accepted: 3544

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 require

s 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


解题心得:

  1. 题意就是奶牛要去日光浴,奶牛要涂防晒霜,每个奶牛有一个涂防晒霜的区间,每个防晒霜有一个值和数量,问最多可以涂多少只奶牛。
  2. 其实面对的最大的问题就是一个奶牛将可以用多个防晒霜,但是它用了其中一个和另一个奶牛产生冲突的防晒霜,所以可以将防晒霜按照值排序,每次取一个出来,将最小值小于这个防晒霜的奶牛都压入优先队列(按照终点排序),再从优先队列中来取。这样就能先安排好奶终点先结束的奶牛。

#include <stdio.h>
#include <queue>
#include <algorithm>
using namespace std;

const int maxn = 2510;
typedef pair <int,int> P;

P cow[maxn],co[maxn];
int n,m;

int main() {
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
        scanf("%d%d",&cow[i].first,&cow[i].second);
    for(int i=0;i<m;i++)
        scanf("%d%d",&co[i].first,&co[i].second);

    sort(cow,cow+n);
    sort(co,co+m);

    priority_queue <int, vector<int> , greater <int> > qu;
    int j = 0,ans = 0;
    for(int i=0;i<m;i++) {
        while(j<n && cow[j].first <= co[i].first) {
            qu.push(cow[j].second);
            j++;
        }

        while(!qu.empty() && co[i].second) {
            if(qu.top() >= co[i].first) {
                ans++;
                co[i].second--;
            }
            qu.pop();
        }
    }

    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/GoldenFingers/p/9107141.html