【C++】 Day12 区间合并 AcWing 803. 区间合并 (详细)

传送门 

1、题目

2、思路

3、AC代码


前言:

你好!我是Cpt,一位大一双非本科学生,C++方向,目前备战蓝桥杯,欢迎一起学习交流~

1、题目

链接活动 - AcWing

同类型习题 759. 格子染色 - AcWing题库

2、思路

按区间将左端点就行排序

判断区间

其中有三种情况 : 第一种 包含在内 ; 第二种 也是包含但是末端比原区间长 

第三种 不包含 且first>end

3、AC代码

  

#include <iostream> 
#include <vector>
#include <algorithm>

using namespace std;

typedef pair<int, int> PII;

const int N = 100010;

void merge (vector<PII> &segs){
    vector<PII> res;
    //先排序 
    sort(segs.begin(), segs.end());

    int st = -2e9, ed = -2e9;
    //设置区间为[-2e9,-2e9]的目的
    //是初始化区间,还有就是防止传入的vector[HTML_REMOVED] &segs 为空区间。
    for (auto seg:segs)
        if (ed<seg.first){
            if (st!=-2e9 )res.push_back({st, ed});  
//如果前后没有if(st != -2e9)的判断,输入数据为空区间时,会把(-2e9, -2e9) 插入res的
            st = seg.first, ed = seg.second;
        }
            else
                ed = max(ed, seg.second);
    //把最后一个区间存入  判断同上
    if (st!=-2e9) res.push_back({st, ed});
    segs =res; 
}

int main () {
    int n;
    cin >> n;
    vector<PII> segs;
    
    for (int i = 0; i < n;i++) {
        int l, r;
        scanf("%d%d", &l, &r);
        segs.push_back({l, r});     
    }

    merge(segs);//区间合并

    cout << segs.size() << endl;
    return 0;
}

如果对您有帮助 能否给我点个  码字不易  感谢观看~~ 

猜你喜欢

转载自blog.csdn.net/weixin_49486457/article/details/122799507