Sunscreen(POJ 3614 优先队列)

Sunscreen
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 5898   Accepted: 2068

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
 1 #include <iostream>
 2 #include <cstring>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6 struct node
 7 {
 8     int a,b;
 9 }cow[2505],s[2505];
10 bool cmp(node x,node y)
11 {
12     return x.a<=y.a;
13 }
14 int main()
15 {
16     int c,l;
17     int i,j;
18     priority_queue<int,vector<int>,greater<int> > Q;
19     freopen("in.txt","r",stdin);
20     scanf("%d%d",&c,&l);
21     for(i=0;i<c;i++)
22         scanf("%d%d",&cow[i].a,&cow[i].b);
23     for(j=0;j<l;j++)
24         scanf("%d%d",&s[j].a,&s[j].b);
25     sort(cow,cow+c,cmp);
26     sort(s,s+l,cmp);
27     j=0;
28     int sum=0;
29     for(i=0;i<l;i++)
30     {
31         while(j<c&&cow[j].a<=s[i].a)
32         {
33             Q.push(cow[j].b);
34             j++;
35         }
36         while(!Q.empty()&&s[i].b)
37         {
38             int t=Q.top();
39             Q.pop();
40             if(s[i].a<=t)
41             {
42                 sum++;
43                 s[i].b--;
44             }
45         }
46     }
47     printf("%d
",sum);
48 }
原文地址:https://www.cnblogs.com/a1225234/p/5173944.html