贪心算法--区间分配

题目描述: 有 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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值