http://poj.org/problem?id=3614
有c头奶牛在沙滩上晒太阳,每头奶牛能忍受的阳光强度有一个最大值(max_spf) 和最小值(min_spf),奶牛有L种防晒霜,每种可以固定阳光强度在某一个值,每种的数量是cover[i] ,每头奶牛只能用一瓶防晒霜,问最多有多少头奶牛能在沙滩上晒太阳。
理解题意之后还是挺好做的。
首先确定的贪心策略是,在满足min_spf的条件下,尽量用spf小的用在max_spf大的奶牛身上,用一个最小堆维护max_spf的最小值即可。
先对奶牛min_spf从小到大排序,在对防晒霜spf从小到大排序。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <vector> 5 #include <cstring> 6 #include <string> 7 #include <algorithm> 8 #include <string> 9 #include <set> 10 #include <functional> 11 #include <numeric> 12 #include <sstream> 13 #include <stack> 14 #include <map> 15 #include <queue> 16 #pragma comment(linker, "/STACK:102400000,102400000") 17 #define CL(arr, val) memset(arr, val, sizeof(arr)) 18 19 #define ll long long 20 #define inf 0x7f7f7f7f 21 #define lc l,m,rt<<1 22 #define rc m + 1,r,rt<<1|1 23 #define pi acos(-1.0) 24 25 #define L(x) (x) << 1 26 #define R(x) (x) << 1 | 1 27 #define MID(l, r) (l + r) >> 1 28 #define Min(x, y) (x) < (y) ? (x) : (y) 29 #define Max(x, y) (x) < (y) ? (y) : (x) 30 #define E(x) (1 << (x)) 31 #define iabs(x) (x) < 0 ? -(x) : (x) 32 #define OUT(x) printf("%I64d ", x) 33 #define lowbit(x) (x)&(-x) 34 #define Read() freopen("a.txt", "r", stdin) 35 #define Write() freopen("b.txt", "w", stdout); 36 #define maxn 1000000000 37 #define N 2510 38 #define mod 1000000000 39 using namespace std; 40 41 typedef pair<int,int>P; 42 P cow[N],bottle[N]; 43 44 priority_queue<int, vector<int>, greater<int> >q; 45 int main() 46 { 47 // freopen("a.txt","r",stdin); 48 int c,l; 49 while(~scanf("%d%d",&c,&l)) { 50 for(int i=0;i<c;i++) { 51 scanf("%d%d",&cow[i].first,&cow[i].second); 52 } 53 for(int i=0;i<l;i++) { 54 scanf("%d%d",&bottle[i].first,&bottle[i].second); 55 } 56 sort(cow,cow+c); 57 sort(bottle,bottle+l); 58 int j=0,ans=0; 59 for(int i=0;i<l;i++) 60 { 61 while(j<c&&cow[j].first<=bottle[i].first) 62 { 63 q.push(cow[j].second); 64 j++; 65 } 66 while(!q.empty()&&bottle[i].second) 67 { 68 int x=q.top(); 69 q.pop(); 70 if(x>=bottle[i].first) 71 { 72 ans++; 73 bottle[i].second--; 74 } 75 } 76 } 77 printf("%d ",ans); 78 } 79 return 0; 80 }