poj3614 Sunscreen 题解报告

题目传送门

【题目大意】

有$C$头奶牛晒日光浴,第$i$头奶牛需要$minSPF[i]$至$maxSPF[i]$之间的日光强度。现在有$L$个防晒霜,第$i$个防晒霜可以使日光强度控制在$SPF[i]$,可以供$cover[i]$头奶牛使用,求最多能满足多少头奶牛。

【思路分析】

 其实很容易想到贪心,类似于线段覆盖,把每头奶牛按照$minSPF[i]$的值从小到大排序,把防晒霜也按照$SPF[i]$的值从小到大排序,加一个优先队列,让$maxSPF[i]$小的奶牛先使用防晒霜。

【代码实现】

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<queue>
 5 #define rg register
 6 #define go(i,a,b) for(rg int i=a;i<=b;i++)
 7 using namespace std;
 8 const int N=2502;
 9 int c,l,ans=0;
10 struct cow{
11     int min,max;
12 }a[N];
13 struct lotion{
14     int SPF,cover;
15 }b[N];
16 priority_queue< int,vector<int>,greater<int> >q;
17 bool cmpa(cow A,cow B){
18     if(A.min!=B.min) return A.min<B.min;
19     else return A.max<B.max;
20 }
21 bool cmpb(lotion A,lotion B){
22     if(A.SPF!=B.SPF) return A.SPF<B.SPF;
23     else return A.cover<B.cover;
24 }
25 int main(){
26     scanf("%d%d",&c,&l);
27     go(i,1,c) scanf("%d%d",&a[i].min,&a[i].max);
28     go(i,1,l) scanf("%d%d",&b[i].SPF,&b[i].cover);
29     sort(a+1,a+1+c,cmpa);sort(b+1,b+1+l,cmpb);
30     int now=1;
31     go(x,1,l){
32         while(now<=c && a[now].min<=b[x].SPF)q.push(a[now].max),++now;
33         while(!q.empty() && b[x].cover)
34         {
35             int tmp=q.top();q.pop();
36             if(b[x].SPF<=tmp)++ans,--b[x].cover;
37         }
38     }
39     printf("%d\n",ans);
40     return 0;
41 }
代码戳这里

转载于:https://www.cnblogs.com/THWZF/p/11249325.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值