描述
C (1 ≤ C ≤ 2500) 头奶牛在海滩边晒太阳,要避免在日光浴时产生难看的灼伤,每头奶牛必须用防晒霜覆盖它的皮肤。第 i 头奶牛有一个最小和最大 SPF 值 (1 ≤ minSPF ≤ 1,000; minSPF ≤ maxSPF ≤ 1,000) 将会起作用。如果 SPF 值太低,则奶牛会受到日光灼伤;如果 SPF 值太高,则牛奶无法进行日光浴。
奶牛们有一个野餐篮子,带了 L (1 ≤ L ≤ 2500) 瓶防晒霜乳液,第 i 瓶的 SPF 值是 SPF (1 ≤ SPF ≤ 1,000) 。第 i 瓶防晒霜可以涂抹覆盖 cover 头奶牛。一头牛奶只能用一瓶防晒霜涂抹。
对于给定的防晒霜乳液,最多可以有多少头奶牛能够在日光浴时避免被灼伤?
输入
* 第 1 行: 两个以空格分隔的整数: C 和 L
* 第 2 到 C+1 行: 第 i 行描述了第 i 头奶牛的防晒霜约束条件,包括两个整数: minSPF 和 maxSPF
* 第 C+2 到 C+L+1 行: 第 i+C+1 行描述了第 i 个防晒霜瓶,包括以空格分隔的整数: SPF 和 cover
输出
只包含一个整数的单行,表示日光浴时受到防晒保护的奶牛的最大数量。
示例输入
3 2
3 10
2 5
1 5
6 2
4 1
示例输出
2
分析
这个就是点能覆盖最多区间个数的问题
我们按右端点排好序,然后从左边开始选有没有点能覆盖当前区间的点去覆盖
为什么这样做?
因为后面的区间有两种可能
1.后面区间左端点在当前区间左端点前面,这个没有影响
2.后面区间左端点在当前区间左端点后面,这时你就明白为什么要从左边开始选了。因为后面区间的左端点更靠后,有可能前边一个区间能选到的点,后面那个区间够不着,而当前又把靠后的点选了,万一后面的区间只有那个靠后的点可选,那它就无点可选了,此时显然当前区间选更考前的点会更优
所以,题目讲完了
代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 2505
#define inf (1<<30)
#define RG register int
#define rep(i,a,b) for(RG i=a;i<=b;i++)
using namespace std;
int n,m,ans;
int pos[];
struct Dat{
int l,r;
bool operator < (const Dat &a)const{
return r<a.r;
}
}dat[maxn];
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int main()
{
int a,b;
n=read();m=read();
rep(i,,n) dat[i].l=read(),dat[i].r=read();
sort(dat+,dat++n);
rep(i,,m) a=read(),b=read(),pos[a]+=b;
rep(i,,n)
{
rep(j,dat[i].l,dat[i].r)
if(pos[j]){pos[j]--,ans++;break;}
}
printf("%d",ans);
return ;
}