当前位置: 首页 > news >正文

【贪心】AcWing 907. 区间覆盖

907. 区间覆盖

文章目录

  • 题目描述
    • 输入格式:
    • 输出格式:
    • 数据范围
    • 输入样例
    • 输出样例
  • 方法:贪心
    • 解题思路
    • 代码
    • 复杂度分析:

题目描述

给定 N 个闭区间 [ a i , b i ] [a_i,b_i] [ai,bi] 以及一个线段区间 [ s , t ] [s,t] [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。

输出最少区间数,如果无法完全覆盖则输出 −1。

输入格式:

第一行包含两个整数 s 和 t,表示给定线段区间的两个端点。

第二行包含整数 N,表示给定区间数。

接下来 N 行,每行包含两个整数 a i , b i a_i,b_i ai,bi,表示一个区间的两个端点。

输出格式:

输出一个整数,表示所需最少区间数。

如果无解,则输出 −1。

数据范围

  • 1 ≤ N ≤ 1 0 5 1≤N≤10^5 1N105
  • − 1 0 9 ≤ a i ≤ b i ≤ 1 0 9 -10^9≤a_i≤b_i≤10^9 109aibi109
  • − 1 0 9 ≤ s ≤ t ≤ 1 0 9 -10^9≤s≤t≤10^9 109st109

输入样例

1 5
3
-1 3
2 4
3 5

输出样例

2

方法:贪心

解题思路

将所有区间按照左端点从小到大进行排序

从前往后枚举每个区间,在所有能覆盖start的区间中,选择右端点的最大区间,然后将start更新成右端点的最大值

代码

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100010;

int n;
struct Range
{
    int l, r;
    bool operator< (const Range &W)const
    {
        return l < W.l;
    }
}range[N];

int main()
{
    int st, ed;
    scanf("%d%d", &st, &ed);
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        scanf("%d%d", &l, &r);
        range[i] = {l, r};
    }

    sort(range, range + n);

    int res = 0;
    bool success = false;
    for (int i = 0; i < n; i ++ )
    {
        int j = i, r = -2e9;
        while (j < n && range[j].l <= st)
        {
            r = max(r, range[j].r);
            j ++ ;
        }

        if (r < st)
        {
            res = -1;
            break;
        }

        res ++ ;
        if (r >= ed)
        {
            success = true;
            break;
        }

        st = r;
        i = j - 1;
    }

    if (!success) res = -1;
    printf("%d\n", res);

    return 0;
}

复杂度分析:

  • 时间复杂度: O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
  • 空间复杂度: O ( n ) O(n) O(n)

相关文章:

  • 公司简介在哪里查询/小程序seo推广技巧
  • 展示型网站设计/seo网站推广技术
  • 知名的集团门户网站建设企业/互联网销售
  • 深圳注册公司可以申请车牌吗/网络营销企业网站优化
  • 网站备案必须去做公安备案吗/seo排名优化软件免费
  • 北京市建设网站首页/seo管理系统创作
  • C++ STL
  • Elasticsearch高级查询—— 查询所有文档
  • 微电网(风、光、储能、需求响应)【Simulink 仿真实现】
  • Apache Solr 9.1-(一)初体验单机模式运行
  • Android自定义绘制1-1 Plus
  • 在线教育-谷粒学院学习笔记(四)
  • gdb打印数据类型大小
  • 深度学习是什么?深度学习和神经网络的区别是什么
  • 【云原生】k8s图形化管理工具之rancher
  • word查看技巧:如何快速找到文档的修改痕迹
  • 一 、Qml开发之环境搭建
  • 输入设备应用