【C++代码】区间重叠问题

博客探讨了如何使用C++解决区间重叠问题,即给定一系列事件的开始和结束时间,找出最多同时发生多少个事件。文章通过三种方法进行讲解,包括直接判断、维护时刻事件计数数组,以及提及的更高效率的方法。并提供了C++代码示例。
摘要由CSDN通过智能技术生成

题目:输入n个区间,给出每个区间的开始位置和结束位置(都是整数),求最多有多少个区间重叠?

       

该题目也可描述为给出每件事情的开始时间和结束时间(都为整数),求最多有多少个事件同时发生?以下的讲解以这种时间的概念讲解(感觉更容易理解一些)。

       
       
输入输出用例:第一行为事件个数,从第二行开始,每行为一个事件的开始时间和结束时间,中间用空格隔开。
5
1         4
1         2
2         3
3         4
3         5
       
       

方法一:
        求最多有多少个事件同时发生,那我们可以依次把每个时刻(都是整数)发生了多少个事件求出来,找出最大值,即为答案。
        如图,先求出t1时刻发生了多少事件,再求t2时刻发生了多少事件,再求t3时刻发生了多少事件,一直求到t4时刻发生了多少事件。
        求某一时刻发生了多少事件,需要遍历所有事件,判断事件的起始时间start和结束时间end是否满足:start<=t<end,若满足,则t时刻发生的事件数+1。
       
        时间复杂度度警告!!!这种方法时间复杂度非常高,一共有tmax个时刻,每个时刻遍历一遍所有事件判断该事件在当前时刻是否发生,O(tmax*n)的复杂度。

C++代码:

int main() {
   
    // 处理输入输出
    int n;
    cin >> n;
    vector<vector<int>> vec(n,vector<int> (2));  // 保存每个事件的起始时间和结束时间
    int max_en = 0;       // 保存最大的时间
    for (int i 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值