LC2332坐上公交车的最晚时间

文章描述了如何使用贪心策略来确定最晚的公交车上车时间,使得乘客不需要排队,或者在必要时在最后一个人之前插队。通过排序和模拟上车过程,计算出最优的上车时间。
摘要由CSDN通过智能技术生成

题目:给公交车发车时间表buses,以及乘客到达站点时间passengers。buses不同时,乘客也不同时。以及bus容量capacity。求你的最晚上车时间(不能和乘客同时)。

思路:贪心。尽量做最晚那班车,不用排队就最后上车。要排队就找到最晚上车的人,在他前面插队。

int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) {
    //要排队:能坐最后一辆车的最后一个人,在他之前插队上车就行。
    //不用排队就最晚一辆车时间就行。
    int bus = 0;//标记要发车的bus下标
    int peo = 0;//第一个未上车的人。
    int curcap = capacity;//当前剩余座位
    sort(buses.begin(),buses.end());
    sort(passengers.begin(),passengers.end());
    while(bus < buses.size() && peo < passengers.size()){//模拟上车
        curcap = capacity;
        while(peo < passengers.size() && passengers[peo] <= buses[bus] && curcap > 0){//能上的都上
            curcap--;
            peo++;
        }
        bus ++;//不行下一辆
    }
    int lastpeo = peo-1;//最后一个上车的
    if(lastpeo < 0) return buses.back();//没人上
    //还有车 或者 (还能上 && 最后一个人不是踩点)
    if(bus < buses.size() || (curcap > 0 && passengers[lastpeo] != buses.back())) return buses.back();
    //否则往前插队就行
    int res = passengers[lastpeo];
    while(lastpeo >= 0 && passengers[lastpeo] == res) {
        lastpeo --;
        res --;
    }
    return res;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值