题目描述
有 C 头奶牛进行日光浴,第 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 行输入 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
Solution
有一种贪心算法:按
m
i
n
S
P
F
minSPF
minSPF 从大到小考虑每头奶牛,选取当前未被选取的
S
P
F
SPF
SPF 最大的防晒霜。
证明其正确性:
可以发现此题是一个二分图的最大匹配问题,于是我们可以证明按照贪心算法得到的匹配是最大匹配,即该匹配不存在增广路。
考虑反证法,设奶牛编号为
c
i
c_i
ci ,防晒霜为
s
i
s_i
si ,
若存在一条增广路,取其中最短的一条
s
1
→
c
1
→
s
2
→
c
2
→
⋯
→
s
n
→
c
n
s_1\rightarrow c_1\rightarrow s_2\rightarrow c_2\rightarrow\cdots\rightarrow s_n\rightarrow c_n
s1→c1→s2→c2→⋯→sn→cn ,则:
引理 :
c
1
,
c
2
,
.
.
.
,
c
n
c_1,c_2,...,c_n
c1,c2,...,cn 的
m
i
n
S
P
F
minSPF
minSPF 递增
证明:
若存在
c
i
+
1
c_{i+1}
ci+1 使得
m
i
n
S
P
F
[
c
i
+
1
]
<
m
i
n
S
P
F
[
c
i
]
minSPF[c_{i+1}]<minSPF[c_i]
minSPF[ci+1]<minSPF[ci] ,则可将
s
i
−
1
s_{i-1}
si−1 直接连向
c
i
+
1
c_{i+1}
ci+1 ,
此时存在一条更短的增广路,矛盾,故引理1成立。
因此,由于增广路最后一条边必须是非匹配边,因此 c n c_n cn 没有匹配点,但由于引理可知 c n c_n cn 在排序后位于 c 1 ∼ c n − 1 c_1\sim c_{n-1} c1∼cn−1 之前,又由于贪心算法, c n c_n cn 会与 s n s_n sn 匹配,矛盾,因此贪心算法正确。
证明参考自 yxc 大佬