【题】【贪心】NKOJ3827 火车运输

3 篇文章 0 订阅
2 篇文章 0 订阅

NKOJ3827 火车运输
时间限制 : - MS 空间限制 : 265536 KB
评测说明 : 1000ms

问题描述
ByteLand火车站(编号0)每天都要发往全国各地N列客运火车,编号1 N。第i列火车的目的地是编号Si的火 车站。 对任意车站X,都与X+1车站有铁轨直接相连,因此火车站可以看成数轴上的整数点,第i列火车可以停靠区 间[0, Si]中的各个站点。每列火车装载乘客的最大容量为Ci。 有M个人需要乘坐火车。已知每个人的乘车区间为[Li, Ri],即是说,在Li上车,在Ri下车。 由于火车的容量限制,请你求出最多有多少人的乘车需求可以得到满足。

输入格式
第1行:2个整数N和M。
接下来N行,每行2个整数Si和Ci,表示第i辆车的目的站和容量。
接下来M行,每行2个整数Li和Ri,表示第i个乘客的乘车区间。

输出格式
第1行:1个整数,表示最多有多少乘客的乘车需求可以满足

样例输入
1 3
10 2
1 5
3 7
4 9

样例输出
2

提示
1 ≤ N,M ≤ 10^5
1 ≤ Si,Ci ≤ 10^9
1 ≤ Li ≤ Ri ≤ 10^9

来源 八中

先将一辆容积为c的火车看做c辆容积为1的火车,再将每辆火车看做s到0的行程,每个人看做r到l的行程
然后贪心,
每次上一个人的时候优先选择下车位置大(离0远)的人,上一辆出发地大于等于自己上车位置、离自己上车位置最近的车。然后将它的下车位置看做该列车新的出发地。

#include<cstdio>
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
const int need=1e5+5;

int n,m;
//.........................................
inline void in_(int &d)
{
    char t=getchar();
    while(t<'0'||t>'9') t=getchar();
    for(d=0;!(t<'0'||t>'9');t=getchar()) d=(d<<1)+(d<<3)+t-'0';
}
inline void out_(int x)
{
    if(x>=10) out_(x/10);
    putchar(x%10+'0');
}
//.................................................
multiset<int> s;

struct fy
{
    int a,b;
}  pr[need]; 

bool way(const fy &a,const fy &b)
{
    if(a.a!=b.a) return a.a>b.a;
    return a.b>b.b;
}
//.................................................

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1,j,ss,c;i<=n;i++)
    {
        in_(ss),in_(c);
        for(j=1;j<=c;j++) s.insert(ss);
    }
    for(int i=1;i<=m;i++)
    {
        in_(pr[i].a),in_(pr[i].b);
    }
    sort(pr+1,pr+1+m,way);
    multiset<int>::iterator it;
    int ans=0;
    for(int i=1;i<=m;i++)
    {
        it=s.lower_bound(pr[i].b);
        if(s.end()!=it)
        {
            s.erase(it);
            s.insert(pr[i].a);
            ans++;
        }
    }
    cout<<ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值