题目描述
有
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 种之后,身体接收到的阳光强度就会稳定为
S
P
F
[
i
]
SPF[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 行,按次序每行输入一头牛的
m
i
n
S
P
F
minSPF
minSPF 和
m
a
x
S
P
F
maxSPF
maxSPF 值,即第
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 行,按次序每行输入一种防晒霜的
S
P
F
SPF
SPF 和
c
o
v
e
r
cover
cover 值,即第
i
i
i 行输入
S
P
F
[
i
]
SPF[i]
SPF[i] 和
c
o
v
e
r
[
i
]
cover[i]
cover[i]。
每行的数据之间用空格隔开。
输出格式
输出一个整数,代表最多可以满足奶牛日光浴的奶牛数目。
数据范围
1
≤
C
,
L
≤
2500
,
1≤C,L≤2500,
1≤C,L≤2500,
1
≤
m
i
n
S
P
F
≤
m
a
x
S
P
F
≤
1000
,
1≤minSPF≤maxSPF≤1000,
1≤minSPF≤maxSPF≤1000,
1
≤
S
P
F
≤
1000
1≤SPF≤1000
1≤SPF≤1000
输入样例:
3 2
3 10
2 5
1 5
6 2
4 1
输出样例:
2
题解
贪心思路:按照minSPF递减将奶牛排序,对于每头奶牛,给它使用它可以使用的且还剩余的防晒霜
算法证明:
排序后,如果编号在前的奶牛
A
A
A可以使用防晒霜
x
x
x或防晒霜
y
(
S
P
F
(
x
)
<
S
P
F
(
y
)
)
y(SPF(x)<SPF(y))
y(SPF(x)<SPF(y)),那么编号在后的奶牛
B
B
B可能出现
x
,
y
x,y
x,y都能用,
x
,
y
x,y
x,y都不能用以及
x
x
x能用
y
y
y不能用这三种情况之一
换言之,如果
y
y
y不能给
b
b
b用,
x
x
x就一定也不能给
b
b
b用
潜在的逻辑关系比较复杂:
s
p
f
m
i
n
(
a
)
≤
s
p
f
(
x
)
<
s
p
f
(
y
)
≤
s
p
f
m
a
x
(
a
)
spfmin(a)\leq spf(x)<spf(y)\leq spfmax(a)
spfmin(a)≤spf(x)<spf(y)≤spfmax(a)
s
p
f
m
i
n
(
b
)
≤
s
p
f
m
i
n
(
a
)
spfmin(b)\leq spfmin(a)
spfmin(b)≤spfmin(a)
s
p
f
m
i
n
(
b
)
≤
s
p
f
m
i
n
(
a
)
≤
s
p
f
(
x
)
<
s
p
f
(
y
)
spfmin(b)\leq spfmin(a)\leq spf(x)<spf(y)
spfmin(b)≤spfmin(a)≤spf(x)<spf(y)
如果
s
p
f
(
y
)
≤
s
p
f
m
a
x
(
b
)
spf(y)\leq spfmax(b)
spf(y)≤spfmax(b)
那么
s
p
f
m
i
n
(
b
)
≤
s
p
f
(
x
)
<
s
p
f
(
y
)
≤
s
p
f
m
a
x
(
b
)
spfmin(b)\leq spf(x)<spf(y)\leq spfmax(b)
spfmin(b)≤spf(x)<spf(y)≤spfmax(b)
证毕
所以为了使整体结果最优,就要使局部最优
即把
y
y
y给奶牛
A
A
A使用
所以就有了如上的贪心思路
具体代码实现如下所示
code
#include<bits/stdc++.h>
using namespace std;
struct node
{
int spf1,spf2;
}cow[3000];
struct node1
{
int spf,cover;
}SP[3000];
bool cmp(node x,node y)
{
return x.spf1>y.spf1;
}
bool cmp1(node1 x,node1 y)
{
return x.spf>y.spf;
}
int main()
{
int c,l;
scanf("%d%d",&c,&l);
for(int i=1;i<=c;i++) scanf("%d%d",&cow[i].spf1,&cow[i].spf2);
sort(cow+1,cow+1+c,cmp);
for(int i=1;i<=l;i++) scanf("%d%d",&SP[i].spf,&SP[i].cover);
sort(SP+1,SP+1+l,cmp1);
int ans=0;
for(int i=1;i<=c;i++)
{
for(int j=1;j<=l;j++)
{
if(SP[j].spf<cow[i].spf1) break;
if(SP[j].spf<=cow[i].spf2&&SP[j].cover)
{
SP[j].cover--;
ans++;
break;
}
}
}
cout<<ans;
return 0;
}