乐逍遥xwl

导航

POJ 3614 Sunscreen (优先队列)

Sunscreen

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

 

样例解释:第一种防晒霜的固定阳光强度6可以用于第一头 [3,10] 的牛,答案加一,第一种防晒霜两瓶变成一瓶;

第二种防晒霜的固定阳光强度4可以用于第二头 [2,5] 的牛或者第三头 [1,5] 的牛,但是这种防晒霜只有一瓶,

所以答案加一,第二种防晒霜没了,结束,所以答案是2。

思路:看懂样例的话,理解题意应该就没问题了。这题应该想到用贪心的思想,对奶牛的阳光承受区间从小到大排序,

对防晒霜的固定阳光强度从小到大排序,然后用优先队列处理就好了......

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<map>
 6 #include<set>
 7 #include<vector>
 8 #include<queue>
 9 using namespace std;
10 #define ll long long 
11 const int inf=1e9+7;
12 const int mod=1e9+7;
13 
14 const int maxn=3e3+10;
15 
16 bool cmp(const pair<int,int> &a,const pair<int,int> &b)
17 {
18     if(a.first != b.first)//优先排min_spfi 
19         return a.first < b.first;
20     else if(a.first == b.first)//min_spfi相同排max_spfi 
21         return a.second < b.second;
22 }
23 
24 int main()
25 {
26     ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
27     
28     priority_queue<int,vector<int>,greater<int> >q;//优先出队小的元素 
29     
30     /*q.push(1);q.push(5);q.push(3);//test 
31     
32     while(!q.empty())
33     {
34         cout<<q.top()<<endl;
35         q.pop();
36     }*/
37     
38     pair<int,int> cow[maxn],you[maxn];//定义两个pair数组,比较方便 
39     
40     int c,l;
41     cin>>c>>l;
42     
43     for(int i=0;i<c;i++)//输入每只奶牛的min_spfi和max_spfi 
44         cin>>cow[i].first>>cow[i].second;
45     
46     for(int i=0;i<l;i++)//输入每瓶油(防晒霜2333)的固定阳光强度和瓶数 
47         cin>>you[i].first>>you[i].second;
48         
49     sort(cow,cow+c,cmp);//排序 
50     
51     sort(you,you+l,cmp);//排序 
52     
53     //for(int i=0;i<c;i++)//test 
54     //    cout<<cow[i].first<<" "<<cow[i].second<<endl;
55     
56     ll int ans=0;//记录答案 
57     
58     int now=0;
59     
60     for(int i=0;i<l;i++)//对每瓶油对奶牛遍历 
61     {
62         while(now<c&&cow[now].first<=you[i].first)//固定阳光强度大于奶牛的min_spfi 
63         {
64             q.push(cow[now].second);//入队 
65             now++;//找下一头奶牛 
66         }
67         
68         while(!q.empty())//队列不为空 
69         {
70             if(you[i].second==0)//油没了直接break 
71                 break;
72             
73             int x=q.top();//找出奶牛的max_spfi 
74             q.pop();
75             
76             if(x>=you[i].first)//固定阳光强度不超过牛的max_spfi 
77             {
78                 ans++;//成功 
79                 you[i].second--;//油减一瓶 
80             }
81             else//否则跳过 
82                 continue;
83     
84         }
85         
86     }
87     
88     cout<<ans<<endl;//输出答案 
89         
90     return 0;
91 }

 

posted on 2019-07-09 21:19  乐逍遥xwl  阅读(157)  评论(0编辑  收藏  举报