https://www.acwing.com/problem/content/112/
题意
有
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种防晒霜可使得接收到的阳光强度稳定为SPF[i]。
第
i
i
i种防晒霜有
c
o
v
e
r
[
i
]
cover[i]
cover[i]瓶。
求至多可以满足多少头奶牛进行日光浴。
输入格式如下
C
C
C
L
L
L
接下来
C
C
C行
第
i
i
i头牛的
m
i
n
S
P
F
minSPF
minSPF和
m
a
x
S
P
F
maxSPF
maxSPF
接下来
L
L
L行
第
i
i
i种防晒霜的
S
P
F
SPF
SPF和
c
o
v
e
r
[
i
]
cover[i]
cover[i]
思路
考虑首先将所有奶牛按照
m
i
n
S
P
F
minSPF
minSPF降序排序。
接下来,对于每一头奶牛,遍历所有防晒霜,寻找到防晒指数介于这头奶牛可接受的最小强度和最大强度之间,并且仍有剩余的防晒霜。即
m
i
n
S
P
F
<
S
P
F
<
m
a
x
S
P
F
,
c
o
v
e
r
>
0
minSPF<SPF<maxSPF,cover>0
minSPF<SPF<maxSPF,cover>0
不妨记我们当前选择的这头奶牛为
c
o
w
[
i
]
cow[i]
cow[i]。
接下来,我们考虑对于这些满足条件的防晒霜,应该选取何种使用才是最优的。
不妨考虑这样两种防晒霜
x
x
x和
y
y
y,
x
x
x的防晒指数小于
y
y
y,即
S
P
F
[
x
]
<
S
P
F
[
y
]
SPF[x]<SPF[y]
SPF[x]<SPF[y]。
由于我们已经将所有奶牛按照
m
i
n
S
P
F
minSPF
minSPF降序排序,并且
x
x
x和
y
y
y都可以提供给
c
o
w
[
i
]
cow[i]
cow[i]使用,所以对于
c
o
w
[
i
]
cow[i]
cow[i]之后的这头奶牛
c
o
w
[
i
+
1
]
cow[i+1]
cow[i+1],这两款防晒霜的可使用情况只有三种。
- x x x和 y y y均可以给 c o w [ i + 1 ] cow[i+1] cow[i+1]使用,即 m i n S P F [ i + 1 ] < S P F [ x ] < S P F [ y ] < m a x S P F [ i + 1 ] minSPF[i+1]<SPF[x]<SPF[y]<maxSPF[i+1] minSPF[i+1]<SPF[x]<SPF[y]<maxSPF[i+1]
- x x x和 y y y均不可给 c o w [ i + 1 ] cow[i+1] cow[i+1]使用,即 m i n S P F [ i + 1 ] < m a x S P F [ i + 1 ] < S P F [ x ] < S P F [ y ] minSPF[i+1]<maxSPF[i+1]<SPF[x]<SPF[y] minSPF[i+1]<maxSPF[i+1]<SPF[x]<SPF[y]
- x x x可给 c o w [ i + 1 ] cow[i+1] cow[i+1]使用,而 y y y不可,即 m i n S P F [ i + 1 ] < S P F [ x ] < m a x S P F [ i + 1 ] < S P F [ y ] minSPF[i+1]<SPF[x]<maxSPF[i+1]<SPF[y] minSPF[i+1]<SPF[x]<maxSPF[i+1]<SPF[y]
由此不难看出,在满足 m i n S P F < S P F < m a x S P F , c o v e r > 0 minSPF<SPF<maxSPF,cover>0 minSPF<SPF<maxSPF,cover>0而可供使用的防晒霜中,选择 S P F SPF SPF值最大的使用最有利于整体。
#include <iostream>
#include <algorithm>
#include <queue>
#include<map>
using namespace std;
const int N = 100010;
typedef pair<int, int> PII;
PII cows[N];
map<int,int> sunscreens;
int C, L;
int ans;
void solve()
{
sort(cows,cows+C,greater<PII>());
ans=0;
sunscreens[0]=sunscreens[1001]=C;
for(int i=0;i<C;i++){
auto spf=sunscreens.upper_bound(cows[i].second);
spf--;
if(spf->first>=cows[i].first)
{
ans++;
if(--spf->second==0)
sunscreens.erase(spf);
}
}
}
int main()
{
cin >> C;
cin >> L;
for (int i = 0; i < C; i++)
{
int minSPF;
int maxSPF;
cin >> minSPF >> maxSPF;
cows[i].first = minSPF;
cows[i].second = maxSPF;
}
for (int i = 0; i < L; i++)
{
int SPF;
int cover;
cin >> SPF >> cover;
sunscreens[SPF]+=cover;
}
solve();
cout << ans << endl;
return 0;
}