[Usaco2007 Nov]tanning分配防晒霜

本文介绍了一种算法,用于解决如何将不同SPF值的防晒霜最优地分配给具有特定SPF需求的奶牛,以便最大化能够享受日光浴的奶牛数量。通过排序和遍历策略,确保了每头奶牛都能获得最适合其需求的防晒霜。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
奶牛们计划着去海滩上享受日光浴。为了避免皮肤被阳光灼伤,所有C(1<=C<=2500)头奶牛必须在出门之前在身上抹防晒霜。第i头奶牛适合的最小和最 大的SPF值分别为minSPFimaxSPFi(1<=minSPFi<=1,000; minSPFi<=maxSPFi<=1,000)。如果某头奶牛涂的防晒霜的SPF值过小,那么阳光仍然能 把她的皮肤灼伤;如果防晒霜的SPF值过大,则会使日光浴与躺在屋里睡觉变得 几乎没有差别。为此,奶牛们准备了一大篮子防晒霜,一共L(1<=L<=2500)瓶。第i瓶 防晒霜的SPF值为SPFi(1<=SPFi<=1,000)。瓶子的大小也不一定相同,第i 瓶防晒霜可供coveri头奶牛使用。当然,每头奶牛只能涂某一个瓶子里的防晒霜 ,而不能把若干个瓶里的混合着用。 请你计算一下,如果使用奶牛们准备的防晒霜,最多有多少奶牛能在不被灼 伤的前提下,享受到日光浴的效果?

Input
第1行: 2个用空格隔开的整数:CL
第2..C+1行: 第i+1行给出了适合第i头奶牛的SPF值的范围:minSPFi以及 maxSPFi
C+2..C+L+1行: 第i+C+1行为了第i瓶防晒霜的参数:SPFicoveri,两个 数间用空格隔开。

Output
第1行: 输出1个整数,表示最多有多少头奶牛能享受到日光浴

Sample Input
3 2
3 10
2 5
1 5
6 2
4 1

输入说明
一共有3头奶牛,2瓶防晒霜。3头奶牛适应的SPF值分别为3..10,2..5,以及1..5。2瓶防晒霜的SPF值分别为6(可使用2次)和4(可使用1次)。可能的分配方案为:奶牛1使用第1瓶防晒霜,奶牛2或奶牛3使用第2瓶防晒霜。显然,最多只有2头奶牛的需求能被满足。

Sample Output
2

HINT

Source
Gold

思路
先对每头牛按照最大SPF值排序,那么SPF值更大的防晒霜显然要分给最大SPF值更大的牛,最大SPF值更小的牛选择能满足它的最小的防晒霜即可。

代码

#include <cstdio>
#include <algorithm>

const int maxn=2500;

struct cow
{
    int l,r;

    bool operator <(const cow &other) const
    {
        return r<other.r;
    }
};
struct scr
{
    int lim,v;

    bool operator <(const scr &other) const
    {
        return v<other.v;
    }
};

cow w[maxn+10];
scr r[maxn+10];
int c,k,ans;

int main()
{
    scanf("%d%d",&c,&k);
    for(int i=1; i<=c; i++)
    {
        scanf("%d%d",&w[i].l,&w[i].r);
    }
    for(int i=1; i<=k; i++)
    {
        scanf("%d%d",&r[i].v,&r[i].lim);
    }
    std::sort(w+1,w+c+1);
    std::sort(r+1,r+k+1);
    for(int i=1; i<=c; i++)
    {
        int flag=0;
        for(int j=1; j<=k; j++)
        {
            if((r[j].lim>0)&&(r[j].v>=w[i].l)&&(r[j].v<=w[i].r))
            {
                r[j].lim--;
                flag=1;
                break;
            }
        }
        if(flag)
        {
            ans++;
        }
    }
    printf("%d\n",ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值