题目大意:
有C个奶牛去晒太阳 ,每个奶牛各自能够忍受的阳光强度为
minspfi
m
i
n
s
p
f
i
到
maxspfi
m
a
x
s
p
f
i
,
给出了
L
L
种防晒霜,以及对应数量和能使奶牛拥有的固定阳光强度
Xi
X
i
,
每个奶牛只能抹一瓶防晒霜,最后问能够享受晒太阳的奶牛最多有几个。
1<=C<=2500
1
<=
C
<=
2500
1≤L≤2500
1
≤
L
≤
2500
分析:
将奶牛按
minspfi
m
i
n
s
p
f
i
降序排序,
然后直接枚举奶牛,
对于第
i
i
个奶牛,
选一个在范围内的最大的防晒霜的
X[]
X
[
]
给这头奶牛涂上,
然后最后能够涂上的奶牛个数就是最多能享受的奶牛个数。
因为你假如当前的奶牛
i
i
能涂这
2
2
种防晒霜,那么
我们设,
则第
i−1
i
−
1
头奶牛,能涂
a,b
a
,
b
,或者只能涂
a
a
,
那么我们此时给第头奶牛涂
b
b
显然策略更优,
而可以涂,不涂也不行,因为每头奶牛对答案的贡献都是,能涂就涂
时间复杂度:
O(CL)
O
(
C
L
)
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define N 2505
using namespace std;
struct Node { int cmin, cmax; }spf[N];
struct Text { int num, x; }a[N];
int n, m;
bool cmp(Node aa, Node bb)
{
return aa.cmin > bb.cmin;
}
int main()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d %d", &spf[i].cmin, &spf[i].cmax);
for (int i = 1; i <= m; i++)
scanf("%d %d", &a[i].x, &a[i].num);
int ans = 0;
sort(spf + 1, spf + n + 1, cmp);
for (int i = 1; i <= n; i++)
{
int id = 0;
for (int j = 1; j <= m; j++)
if (a[j].num && a[j].x >= spf[i].cmin && a[j].x <= spf[i].cmax)
{
if (a[j].x > a[id].x) id = j;
}
if (id != 0) ans++, a[id].num--;
}
printf("%d\n", ans);
return 0;
}