Sunscreen
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 7371 Accepted: 2602Description
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 1Sample 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;
}