zoukankan      html  css  js  c++  java
  • AcWing 803. 区间合并

    网址 https://www.acwing.com/solution/AcWing/content/1590/

    题目描述
    给定n个区间[l, r]。

    合并所有有交集的区间。

    输出合并完成后的区间个数。

    例如:[1,3]和[2,6]可以合并为一个区间[1,6]。

    输入格式
    第一行包含整数n。

    接下来n行,每行包含两个整数 l 和 r。

    输出格式
    共一行,包含一个整数,表示合并区间完成后的区间个数。

    样例
    输入样例:
    5
    1 2
    2 4
    5 6
    7 8
    7 9
    输出样例:
    3

    算法1
    (暴力模拟) O(n2)O(n2)
    模版题么 简单暴力模拟
    抛开输入输出不说
    判断 各个区间是否重合
    主要是四种情况
    1 A区间的起点在B区间的起点终点之间 Bstart Astart Bend Aend
    2 A区间起点终点在B区间的起点终点之间 Bstart Astart Aend Bend
    反之亦然
    3 B区间的起点在A区间的起点终点之间 Astart Bstart Aend Bend
    4 B区间起点终点在A区间的起点终点之间 Astart Bstart Bend Aend

    但是代码可以归为两种情况判断

    int s1 = vp[i].first;
    int e1 = vp[i].second;

    int s2 = vp[j].first;
    int e2 = vp[j].second;


    if( (s1>= s2 && s1<= e2) || (s2 >=s1 && s2 <= e1) ){
    }
    然后进行合并
    两者区间合并后就是 起点是两者起点的最小值 终点是两者终点的最大值
    代码

    merges = min(s1,s2);
    mergee = max(e1,e2);

    vp[j].first = merges;
    vp[j].second = mergee;

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 
     5 using namespace std;
     6 
     7 int T;
     8 const int N= 100100;
     9 vector<pair<int,int>> vp(N,pair<int,int>(-1,-1));
    10 
    11 int Merge(int i,int j)
    12 {
    13     int s1 = vp[i].first;
    14     int e1 = vp[i].second;
    15 
    16     int s2 = vp[j].first;
    17     int e2 = vp[j].second;
    18 
    19     int merges = 0;int mergee= 0;
    20 
    21     if( (s1>= s2 && s1<= e2) ||  (s2 >=s1 && s2 <= e1)  ){
    22         merges = min(s1,s2);
    23         mergee = max(e1,e2);
    24 
    25         vp[j].first = merges;
    26         vp[j].second = mergee;
    27         return 1;
    28     }
    29 
    30     return 0;
    31 }
    32 
    33 
    34 int main()
    35 {
    36     cin >> T;
    37 
    38     for(int i =1 ;i <= T ;i ++){
    39         cin >> vp[i].first;  cin >> vp[i].second;             
    40     }
    41     int mergeCount =0;
    42     for(int i =1 ; i <=  T;i++){
    43         for(int j = i+1;j<= T;j++){
    44             //比较 i j
    45             int res = Merge(i,j);
    46             if(res){
    47                mergeCount++;
    48                break;
    49             }
    50         }
    51     }
    52 
    53     cout << T - mergeCount << endl;
    54 
    55     return 0;
    56 }
    57 
    58 作者:defddr
    59 链接:https://www.acwing.com/solution/AcWing/content/1590/
    60 来源:AcWing
    61 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    View Code
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    JAVA垃圾收集器
    ora-12154
    获取IE浏览器关闭事件
    ajax 页面请求后,jsp页面定位
    poi 导出excel 异常处理方式--曲线救国法
    如何设计出高可用的分布式架构
    Java知识点整理(二)
    spring cloud & dubbo
    Spring Autowired原理
    如何更好的使用JAVA线程池
  • 原文地址:https://www.cnblogs.com/itdef/p/10886615.html
Copyright © 2011-2022 走看看