区间合并(AcWing.803 )

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

using namespace std;

typedef pair<int, int> PII;

int n;

void merge(vector<PII> &interval)
{
    vector<PII> ans;

    sort(interval.begin(), interval.end()); //! pair排序 优先左端点, 再以右端点排序

    int st = -1e9-10, ed = -1e9-10;  //! 只要比 -1e9 小就可以
    for(auto item:interval)
    {
        if(ed<item.first) //! 第一段区间一定是  ed< item.first
        {
            if(st!=-1e9-10) ans.push_back({st,ed}); //! 第一次在这里初始化
            st = item.first, ed = item.second;//! 第一段区间从这里开始
        }
        else ed = max(ed, item.second);
    }//todo 这个循环结束之后还会剩下一个区间
    if(st!=-1e9-10) ans.push_back({st,ed});  //! 如果不是空的  那我们就加上一段

    interval = ans;
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin >> n;

    vector<PII> interval;
    while(n--)
    {
        int l, r;
        cin >> l >> r;
  
    interval.push_back({l, r});
    }

    merge(interval);

    cout << interval.size() << endl;

    return 0;
}

介绍一种结构体合并区间的算法。

#include<iostream>
#include<algorithm>
#include<cstdio>

using namespace std;

const int N = 100010;
struct node{
    int start;
    int end;
}a[N];
int n;

bool cmp(node c,node d){//结构体排序,保证左区间从小到大排序
    return c.start < d.start;
}

int main(){
    scanf("%d",&n);
    for(int i = 0; i < n; i++) scanf("%d%d",&a[i].start,&a[i].end);
    sort(a,a+n,cmp);
    //for(int i = 0; i < n; i++) cout << a[i].start << ' ' << a[i].end << endl;
    int s = a[0].start,e = a[0].end;
    int ans = 1;//必定有一个区间
    for(int i = 1; i < n; i++){
        if(a[i].start <= e && a[i].end > e) e = a[i].end;//两种情况,有交集
        else if(a[i].start > e) s = a[i].start,e = a[i].end,ans++;//无交集
    }
    cout << ans << endl;
    return 0;
}

 

posted @ 2020-02-23 01:58  想拿牌想考研的菜鸡  阅读(195)  评论(0编辑  收藏  举报