ACWING 110 防晒

https://www.acwing.com/problem/content/112/

题意

C C C头奶牛进行日光浴。其中
i i i头奶牛需要 m i n S P F [ i ] minSPF[i] minSPF[i] m a x S P F [ i ] maxSPF[i] maxSPF[i]单位强度之间的阳光。
每头奶牛接受日光浴之前需要涂防晒霜。
防晒霜有 L L L种,第 i i i种防晒霜可使得接收到的阳光强度稳定为SPF[i]。
i i i种防晒霜有 c o v e r [ i ] cover[i] cover[i]瓶。
求至多可以满足多少头奶牛进行日光浴。

输入格式如下
C C C L L L
接下来 C C C
i i i头牛的 m i n S P F minSPF minSPF m a x S P F maxSPF maxSPF
接下来 L L L
i i i种防晒霜的 S P F SPF SPF c o v e r [ i ] cover[i] cover[i]

思路

考虑首先将所有奶牛按照 m i n S P F minSPF minSPF降序排序。
接下来,对于每一头奶牛,遍历所有防晒霜,寻找到防晒指数介于这头奶牛可接受的最小强度和最大强度之间,并且仍有剩余的防晒霜。即
m i n S P F < S P F < m a x S P F , c o v e r > 0 minSPF<SPF<maxSPF,cover>0 minSPF<SPF<maxSPF,cover>0
不妨记我们当前选择的这头奶牛为 c o w [ i ] cow[i] cow[i]
接下来,我们考虑对于这些满足条件的防晒霜,应该选取何种使用才是最优的。

不妨考虑这样两种防晒霜 x x x y y y x x x的防晒指数小于 y y y,即 S P F [ x ] < S P F [ y ] SPF[x]<SPF[y] SPF[x]<SPF[y]
由于我们已经将所有奶牛按照 m i n S P F minSPF minSPF降序排序,并且 x x x y y y都可以提供给 c o w [ i ] cow[i] cow[i]使用,所以对于 c o w [ i ] cow[i] cow[i]之后的这头奶牛 c o w [ i + 1 ] cow[i+1] cow[i+1],这两款防晒霜的可使用情况只有三种。

  1. x x x y y y均可以给 c o w [ i + 1 ] cow[i+1] cow[i+1]使用,即 m i n S P F [ i + 1 ] < S P F [ x ] < S P F [ y ] < m a x S P F [ i + 1 ] minSPF[i+1]<SPF[x]<SPF[y]<maxSPF[i+1] minSPF[i+1]<SPF[x]<SPF[y]<maxSPF[i+1]
  2. x x x y y y均不可给 c o w [ i + 1 ] cow[i+1] cow[i+1]使用,即 m i n S P F [ i + 1 ] < m a x S P F [ i + 1 ] < S P F [ x ] < S P F [ y ] minSPF[i+1]<maxSPF[i+1]<SPF[x]<SPF[y] minSPF[i+1]<maxSPF[i+1]<SPF[x]<SPF[y]
  3. x x x可给 c o w [ i + 1 ] cow[i+1] cow[i+1]使用,而 y y y不可,即 m i n S P F [ i + 1 ] < S P F [ x ] < m a x S P F [ i + 1 ] < S P F [ y ] minSPF[i+1]<SPF[x]<maxSPF[i+1]<SPF[y] minSPF[i+1]<SPF[x]<maxSPF[i+1]<SPF[y]

由此不难看出,在满足 m i n S P F < S P F < m a x S P F , c o v e r > 0 minSPF<SPF<maxSPF,cover>0 minSPF<SPF<maxSPF,cover>0而可供使用的防晒霜中,选择 S P F SPF SPF值最大的使用最有利于整体。

#include <iostream>
#include <algorithm>
#include <queue>
#include<map>
using namespace std;
const int N = 100010;
typedef pair<int, int> PII;
PII cows[N];
map<int,int> sunscreens;
int C, L;
int ans;

void solve()
{
    sort(cows,cows+C,greater<PII>());
    ans=0;
    sunscreens[0]=sunscreens[1001]=C;
    for(int i=0;i<C;i++){
        auto spf=sunscreens.upper_bound(cows[i].second);
        spf--;
        if(spf->first>=cows[i].first)
        {
            ans++;
            if(--spf->second==0)
                sunscreens.erase(spf);
        }
    }
}

int main()
{
    cin >> C;
    cin >> L;
    for (int i = 0; i < C; i++)
    {
        int minSPF;
        int maxSPF;
        cin >> minSPF >> maxSPF;
        cows[i].first = minSPF;
        cows[i].second = maxSPF;
    }

    for (int i = 0; i < L; i++)
    {
        int SPF;
        int cover;
        cin >> SPF >> cover;
        sunscreens[SPF]+=cover;
    }
    solve();
    cout << ans << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值