标签:
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
题意
有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉。
而刚开始的阳光的强度非常大,奶牛都承受不住,然后奶牛就得涂抹防晒霜,防晒霜的作用是让阳光照在身上的阳光强度固定为某个值。
那么为了不让奶牛烫伤,又不会没有效果。
给出了L种防晒霜。每种的数量和固定的阳光强度也给出来了
每个奶牛只能抹一瓶防晒霜,最后问能够享受晒太阳的奶牛有几个。
可以将奶牛按照阳光强度的最小值从小到大排序。
将防晒霜也按照能固定的阳光强度从小到大排序
从最小的防晒霜枚举,将所有符合 最小值小于等于该防晒霜的 奶牛的 最大值 放入优先队列之中。
然后优先队列是小值先出
所以就可以将这些最大值中的最小的取出来。更新答案。
#include <iostream> #include <algorithm> #include <queue> using namespace std; typedef pair<int,int> p; priority_queue <int, vector<int>, greater<int> > q; //定义优先队列,小的先出队 p n[2505], b[2505]; bool cmp(p x, p y)//按pair类的第一个值排序 { return x.first<y.first; } int main() { int C, L, sum; cin >> C >> L ; for(int i=0; i<C; i++) cin >> n[i].first >> n[i].second ; for(int i=0; i<L; i++) cin >> b[i].first >> b[i].second ; sort(n,n+C,cmp); sort(b,b+L,cmp); int j = 0 ; sum = 0 ; for(int i=0; i<L; i++) { while( j<C && n[j].first<=b[i].first) { q.push(n[j].second); j++ ; } while(!q.empty() && b[i].second) { int temp = q.top() ; q.pop(); if(temp < b[i].first) continue ; sum ++ ; b[i].second -- ; } } cout << sum << endl ; return 0; }
标签:
原文地址:http://www.cnblogs.com/Asimple/p/5487286.html