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(); }