如题:http://poj.org/problem?id=3614
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5145 | Accepted: 1779 |
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
Source
思路:究竟怎么样才能保证有最多的牛能防晒,去让每一瓶防晒霜用在最优的地方,首先对于防晒霜们和牛们分别按照防晒程度和牛的minSPF排序,对于从小到大防晒的防晒霜,最优的牛minSPF是从最小一直到满足防晒程度的,这些满足最小minSPF的牛的maxSPF全部入队列,对于maxSPF比较大的后面还可能有防晒霜满足,所以肯定maxSPF小的开始选。思路就是这样,也可以用网络流,建个图,流量搞清楚。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
#include<functional>
using namespace std;
struct cow
{
int minSPF,maxSPF;
};
cow cows[2501];
struct cover
{
int data;
int num;
};
cover covers[2501];
bool operator<(cow a,cow b)
{
return a.minSPF<b.minSPF;
}
bool operator<(cover a,cover b)
{
return a.data<b.data;
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
priority_queue<int,vector<int>,greater<int> >que;
int C,L;
cin>>C>>L;
int i;
for(i=0;i<C;i++)
cin>>cows[i].minSPF>>cows[i].maxSPF;
for(i=0;i<L;i++)
cin>>covers[i].data>>covers[i].num;
sort(covers,covers+L);
sort(cows,cows+C);
cow *p=cows;
int res=0;
for(i=0;i<L;i++)
{
while(p<cows+C&&p->minSPF<=covers[i].data)
que.push(p++->maxSPF);
while(!que.empty()&&covers[i].num>0)
{
int t=que.top();
que.pop();
if(t>=covers[i].data)
{
res++;
covers[i].num--;
}
}
}
cout<<res<<endl;
return 0;
}