区间问题(贪心)(一)

简介: 复习acwing算法基础课的内容,本篇为讲解基础算法:贪心——区间选点,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。

文章目录

前言

一、贪心

二、例题,代码

AcWing 905. 区间选点

本题分析

AC代码

AcWing 908. 最大不相交区间数量

本题分析

AC代码

AcWing 906. 区间分组

本题分析

AC代码

AcWing 907. 区间覆盖

本题分析

AC代码

三、时间复杂度


前言

复习acwing算法基础课的内容,本篇为讲解基础算法:贪心——区间选点,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、贪心

贪心:利益最大化,即找到最优的情况,贪心问题难在证明,即你可能能推断出这个题目的正确解法,但是这个解法下为什么就是最优解不好证明。


区间问题其实就是区间的左右端点的排序问题


二、例题,代码

AcWing 905. 区间选点

本题链接:AcWing 905. 区间选点

本博客给出本题截图:

image.png

本题分析

把每一段区间按照右端点进行排序,然后开始依次遍历,res代表答案,ed是本区间的右端点,如果存在下一个区间的左端点大于本区间的右端点,那么证明这两个区间内没有交集,就让res ++;,然后把ed更新成下一个区间的右端点.

AC代码

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
struct St
{
    int l, r;
    bool operator < (const St w) const
    {
        return r < w.r;
    }
}st[N];
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        scanf("%d%d", &l, &r);
        st[i] = {l, r};
    }
    sort(st, st + n);
    int res = 0, ed = -1e9;
    for (int i = 0; i < n; i ++ )
        if (st[i].l > ed) 
        {
            res ++;
            ed = st[i].r;
        }
    printf("%d", res);
    return 0;
}

AcWing 908. 最大不相交区间数量

本题链接:AcWing 908. 最大不相交区间数量

本博客给出本题截图:

image.png

本题分析

本题与上题一致

AC代码

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
struct St
{
    int l, r;
    bool operator < (const St w) const
    {
        return r < w.r;
    }
}st[N];
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        scanf("%d%d", &l, &r);
        st[i] = {l, r};
    }
    sort(st, st + n);
    int res = 0, ed = -1e9;
    for (int i = 0; i < n; i ++ )
        if (st[i].l > ed) 
        {
            res ++;
            ed = st[i].r;
        }
    printf("%d", res);
    return 0;
}





目录
相关文章
|
算法 测试技术 C++
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
|
6月前
|
C++
2589. 完成所有任务的最少时间(区间取点——贪心or线段树)
2589. 完成所有任务的最少时间(区间取点——贪心or线段树)
|
6月前
|
算法 测试技术 C++
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数
|
6月前
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
代码随想录Day30 贪心05 LeetCode T435无重叠区间 T763划分字母区间 T56 合并区间
51 0
|
6月前
|
存储 算法 索引
算法题解-汇总区间
算法题解-汇总区间
|
6月前
|
算法
回溯-求出数组的所有子序列【学习算法】
回溯-求出数组的所有子序列【学习算法】
48 0
|
算法 索引
算法:二分查找算法/朴素二分/查找区间左右端点二分
算法:二分查找算法/朴素二分/查找区间左右端点二分
|
人工智能
(闫氏dp分析法)(线性dp)(区间类dp)AcWing 895. 最长上升子序列
(闫氏dp分析法)(线性dp)(区间类dp)AcWing 895. 最长上升子序列
102 0
|
存储 算法
LeetCode 435. 无重叠区间(贪心算法,动态规划)
LeetCode 435. 无重叠区间(贪心算法,动态规划)
124 0
LeetCode 435. 无重叠区间(贪心算法,动态规划)
【题型总结】等差数列覆盖区间问题
【题型总结】等差数列覆盖区间问题
120 0
【题型总结】等差数列覆盖区间问题