题目描述: 有 CC 头奶牛进行日光浴,第 ii 头奶牛需要 minSPF[i]minSPF[i] 到 maxSPF[i]maxSPF[i]
单位强度之间的阳光。 每头奶牛在日光浴前必须涂防晒霜,防晒霜有 LL 种,涂上第 ii 种之后,身体接收到的阳光强度就会稳定为
SPF[i]SPF[i],第 ii 种防晒霜有 cover[i]cover[i] 瓶。 求最多可以满足多少头奶牛进行日光浴。输入格式
第一行输入整数 CC 和 LL 。 接下来的 CC 行,按次序每行输入一头牛的 minSPFminSPF 和 maxSPFmaxSPF
值,即第 ii 行输入 minSPF[i]minSPF[i] 和 maxSPF[i]maxSPF[i] 。 再接下来的 LL
行,按次序每行输入一种防晒霜的 SPFSPF 和 covercover 值,即第 ii 行输入 SPF[i]SPF[i] 和
cover[i]cover[i]。 每行的数据之间用空格隔开。输出格式 输出一个整数,代表最多可以满足奶牛日光浴的奶牛数目。
数据范围 1≤C,L≤25001≤C,L≤2500, 1≤minSPF≤maxSPF≤10001≤minSPF≤maxSPF≤1000,
1≤SPF≤10001≤SPF≤1000 输入样例: 3 2 3 10 2 5 1 5 6 2 4 1输出样例: 2
贪心算法:将n个东西,分配给n个人的最优算法。 每个人的需求是一个区间,然后通过区间排序,按照右区间从小到大排序,从小的开始给。
//正确性
小的给右区间靠前的,因为右区间靠后的可以用大的,那么就把小的先给右区间靠前的,为什么不是左区间,左区间可能他的右端点很大,但是左区间很小,那么就错把小的给了他,导致右区间很小,但是左区
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define x first
#define y second
int c,l;
typedef pair<int,int> PII;
PII cow[300001];
int sj[300001];
int vis[300001];
bool cmp(PII a,PII b)
{
return a.y < b.y;
}
bool cmp2(int x,int y)
{
return x < y;
}
void solve()
{
cin >> c >> l;
for(int i = 1; i <= c; i ++ )
{
int l , r ;
cin >> l >> r;
cow[i].x = l;
cow[i].y = r;
}
int idx = 0;
for(int i = 1; i <= l ; i ++ )
{
int val,gs;
cin >> val >> gs;
while(gs -- )
sj[++idx] = val;
}
sort(cow+1,cow+1+c,cmp);
sort(sj+1,sj+idx+1,cmp2);
int sum = 0;
for(int i = 1; i <= c ; i ++ )
{ int l = cow[i].x;
int r = cow[i].y;
int bj = 1;
for(int j = 1;j <= idx; j ++ )
{
if(vis[j] == 0 && sj[j] <= r && sj[j] >= l)
{ bj = 0;
vis[j] = 1;
break;
}
}
if(bj == 1) continue;
if(bj == 0) sum ++ ;
}
cout << sum << "\n" ;
}
int main()
{
solve();
}