贪心算法(Greedy Algorithm)是一种基于贪心思想实现的算法,它是一种在局部最优的情况下朝着全局最优解前进的算法思想。贪心算法通常处理的问题,是这些问题在某种程度上满足最优子结构的条件。在这种情况下,贪心算法通过每一步都选择当前最优的策略,来达到整体最优解。

贪心算法通常有以下特征:

  1. 基于某种选择策略,每次选择当前最优解。

  2. 每次选择后,问题的规模必须缩小。

  3. 每次选择不必考虑未来的情况,只需考虑当前的情况。

  4. 最终的解必须是通过局部最优解逐步得到的。

贪心算法在实际应用中非常广泛,例如:

  1. 最小生成树问题

  2. 最短路径问题

  3. 活动选择问题

  4. 背包问题

  5. 资源分配问题

贪心算法的一个重要应用是优化问题,即求某个目标函数的最大值或最小值。贪心算法通常得到的结果不一定是全局最优解,但是对于某些问题,贪心算法得到的结果是最优解。

需要注意的是,在某些情况下,贪心算法得到的结果是局部最优解而不是全局最优解,此时需要使用其他算法来找到全局最优解,例如动态规划算法等。

先看题目:

给定 N 个闭区间 [a,b],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。

输出选择的点的最小数量。

位于区间端点上的点也算作区间内。

输入格式
第一行包含整数 N,表示区间数。

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

输出格式
输出一个整数,表示所需的点的最小数量。

数据范围
1≤N≤10^5,
−10^9≤a≤b≤10^9

输入样例

3
-1 1
2 4
3 5

输出样例

2

先给代码再分析

#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 r < W.r;
    }
}range[N];

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

    sort(range, range + n);

    int res = 0, ed = -2e9;
    for (int i = 0; i < n; i ++ )
        if (range[i].l > ed)
        {
            res ++ ;
            ed = range[i].r;
        }

    printf("%d\n", res);

    return 0;
}

1、看一个结构体数组,存储区间的左右端点,如果自身的右端点小于外界的右端点,返回true,否则返回false

2、读入区间的左右端点

3、将端点排序

4、如果当前区间的右端点小于外界的右端点,点的次数++,更新到更长的端点

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐