Sunscreen
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
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?
输入描述:
- 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 输出描述: A single line
with an integer that is the maximum number of cows that can be
protected while tanning
示例1
输入
3 2
3 10
2 5
1 5
6 2
4 1
输出
2
题解:
每个牛所需要的的乳液都在它规定的范围内
我们可以将乳液从小到大排序
将牛的最小需求从小到大排
我们先将牛的最小需求根乳液比较,如果乳液大于最小需求,就存入优先队列里,(优先队列从小到大排),然后再一次比较当前乳液与队列里牛的最大需求,(凡是在队列里的牛,最小需求一定小于乳液,所以只需比较最大需求是否大于)
队列为什么是从小到大排,因为最大需求越小,说明它要达成的条件越苛刻,先把难搞的搞定剩下的好说
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=2520;
int cnt=1, sum;
struct node{
int first;
int second;
}cow[maxn];
struct node1{
int num;
int SPF;
}b[maxn];
bool cmp1(node a,node b) {
return a.second < b.second;
}
bool cmp2(node1 a,node1 b) {
return a.SPF < b.SPF;
}
template<class T>inline void read(T &res)
{
char c;T flag=1;
while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
priority_queue<int, vector<int>, greater<int> > q;
int main() {
int c, l;
cin >> c >> l;
for (int i = 1; i <= c; i++) read(cow[i].second),read(cow[i].first) ;
for (int i = 1; i <=l; i++)read(b[i].SPF),read(b[i].num);
sort(cow+1, cow + c +1, cmp1);
sort(b+1, b + l +1, cmp2);
for (int i = 1; i <= l; i++)
{
while ( cow[cnt].second <= b[i].SPF&&cnt <= c)
{
q.push(cow[cnt].first);
cnt++;
}
while (!q.empty() && b[i].num>=0)
{
int x;
x = q.top();
q.pop();
if (x >= b[i].SPF)
{
b[i].num--;
sum++;
}
}
}
cout << sum << endl;
return 0;
}