L2-014 列车调度

#include <iostream>
#include <set>
using namespace std;

int main() {
    int n, t;
    cin >> n;
    
    // 使用 set 自动维护所有队列的队尾(从小到大排序)
    // 初始化 set,放入 0 作为哨兵(保证 set 非空,且所有车号都 > 0)
    set<int> s;
    s.insert(0);
    
    for (int i = 0; i < n; i++) {
        cin >> t;
        
        // 分析:当前车号 t 需要插入队列
        // 条件:如果 t < 当前所有队列队尾的最大值(即 s 的最后一个元素)
        // 为什么?因为队列要求:队尾必须 > t(才能保证 t 能插入队尾)
        if (t < *s.rbegin()) {
            // 选择最接近 t 的队尾(即第一个大于 t 的队尾值)
            // s.upper_bound(t) 返回第一个大于 t 的迭代器位置
            // *s.upper_bound(t) 取出该位置的值(即要替换的队尾)
            s.erase(*(s.upper_bound(t)));
        }
        
        // 无论是否删除,都要将 t 插入 set(作为新的队尾)
        s.insert(t);
    }
    
    // 结果:s.size() 包含哨兵 0,所以实际队列数 = s.size() - 1
    cout << s.size() - 1;
    return 0;
}
import bisect

def main():
    n = int(input().strip())
    # 使用列表 tails 维护所有队列的队尾(从小到大排序)
    # 初始化 tails,放入 0 作为哨兵(保证非空,且所有车号 > 0)
    tails = [0]
    
    for _ in range(n):
        t = int(input().strip())
        
        # 分析:当前车号 t 需要插入队列
        # 条件:如果 t >= tails 最后一个元素(即当前所有队列队尾的最大值)
        # 为什么?因为队尾必须 > t 才能插入,如果 t 更大则不能插入已有队列
        if t >= tails[-1]:
            # 新开一条队列:将 t 添加到 tails 末尾
            tails.append(t)
        else:
            # 找到第一个大于 t 的位置(即最接近 t 的队尾)
            # bisect.bisect_right(tails, t) 返回插入位置(第一个大于 t 的索引)
            pos = bisect.bisect_right(tails, t)
            # 替换该位置的值为 t(表示 t 成为该队列的新队尾)
            tails[pos] = t
    
    # 结果:tails 包含哨兵 0,所以实际队列数 = len(tails) - 1
    print(len(tails) - 1)

if __name__ == '__main__':
    main()

全部评论

相关推荐

第一次发面经欸,是今天早上面的今天下午oc,喜欢这个温柔小姐姐面试官,许愿以后面试官也是这样引导型的小姐姐😘1.拷打项目20min&nbsp;ing...2.一般用TS&nbsp;里哪些东西,了解泛型吗3.平时用哪些&nbsp;AI&nbsp;呢,在你平时的工作中大概占比是多少4.了解&nbsp;margin&nbsp;的重叠问题吗,这个问题怎么解决,原理是什么5.image&nbsp;标签是行内元素还是块级元素6.讲两个实现&nbsp;div&nbsp;水平垂直居中的方法7.如何实现一个抽奖圆盘?8.如何实现一个文本点开收起展开的那种效果,OK,你说的&nbsp;transform会触发重排吗?那&nbsp;position&nbsp;absolute&nbsp;绝对定位之后会触发吗?9.&nbsp;判断&nbsp;object&nbsp;为空的方法有哪些10.setinterval&nbsp;和&nbsp;settimeout&nbsp;区别11.&nbsp;JS&nbsp;数组方法里边有哪些改变原数组的方法12.&nbsp;session&nbsp;storage&nbsp;和&nbsp;local&nbsp;storage&nbsp;和cookie的区别,cookie什么时候过期13.&nbsp;V&nbsp;-if&nbsp;和&nbsp;V&nbsp;-show&nbsp;的区别,如果现在有一个&nbsp;tab切换,你会选择用&nbsp;V&nbsp;-if&nbsp;还是&nbsp;V&nbsp;-show&nbsp;(tab切换,就是比如说有两个分类,有两个子页面,然后它们是通过两个开关就左右切换。)14.了解&nbsp;keepalive&nbsp;吗?15.Vue&nbsp;里面&nbsp;key&nbsp;的作用16.Vue&nbsp;组件传值的方法有哪些17.手撕:数组转树建议:思路挺清楚的,需要扎实前端基础
查看16道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务