luogu_P2887 [USACO07NOV]防晒霜Sunscreen

https://www.luogu.org/problem/P2887

有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉。

而刚开始的阳光的强度非常大,奶牛都承受不住,然后奶牛就得涂抹防晒霜,防晒霜的作用是让阳光照在身上的阳光强度固定为某个值。

那么为了不让奶牛烫伤,又不会没有效果。

给出了L种防晒霜。每种的数量和固定的阳光强度也给出来了

每个奶牛只能抹一瓶防晒霜,最后问能够享受晒太阳的奶牛有几个。


贪心

奶牛忍受的阳光强度区间按右端点升序排

防晒霜按阳光强度升序排

对于阳光强度区间按右端点升序排好的1-N个奶牛,尽量用可用的最小的阳光强度防晒霜满足

因为要么奶牛x能用防晒霜y,而奶牛x+1不能用

要么奶牛x能用防晒霜y,奶牛x+1也能用,但是若让奶牛x+1用了最后一个防晒霜y(如果不是最后一个那没影响),那么对于新增一个得到满足的奶牛,满足奶牛x的区间,比让奶牛x用了最后一个防晒霜y,满足奶牛x+1的区间要小

#include<iostream>
#include<cstdio>

#define ri register int
#define u int

namespace fast {

    inline u in() {
        u x(0),f(1);
        char s=getchar();
        while(s<'0'||s>'9') {
            if(s=='-') {
                f=-1;
            }
            s=getchar();
        }
        while(s>='0'&&s<='9') {
            x=(x<<1)+(x<<3)+s-'0';
            s=getchar();
        }
        return x*f;
    }

}

using fast::in;

#define NN 2505

#include<algorithm>

namespace all {

    u C,L;

    struct node {
        u a,b;
    } a[NN],b[NN];

    inline bool cmp(const node &x,const node &y) {
        return x.b<y.b;
    }

    inline void solve() {
        C=in(),L=in();
        for(ri i(1); i<=C; ++i) {
            a[i].a=in(),a[i].b=in();
        }
        for(ri i(1); i<=L; ++i) {
            b[i].a=in(),b[i].b=in();
            std::swap(b[i].a,b[i].b);
        }
        std::sort(a+1,a+C+1,cmp);
        std::sort(b+1,b+L+1,cmp);
        u ans(0);
        for(ri i(1); i<=C; ++i) {
            for(ri j(1); j<=L&&b[j].b<=a[i].b; ++j) {
                if(b[j].a&&b[j].b>=a[i].a) {
                    ans++,b[j].a--;
                    break;
                }
            }
        }
        printf("%d",ans);
    }

}

int main() {

    //freopen("x.txt","r",stdin);
    all::solve();

}
原文地址:https://www.cnblogs.com/ling-zhi/p/11736268.html