对贪心的理解

所谓贪心,故名思义,就是想要得到最多,想要最好的情况,一次比一次要得更多。这种算法一般用于局部问题的最优解一般是某种很明显的极端情况,可以通过把当前情况下的某个条件最值化从而得出想要的最佳情况。而且,局部的最优情况还往往可以用于大一点的问题直接求解,而无需像贪心那样需要对被划分成的几个子问题最优解进行再次比较取最优才能获得。所以贪心其实也有最优子结构,但是它们的子结构就要比动态规划的简单,最优化策略也相对容易理解与直白。

解析一题

这里拿选点问题来讲,题目意思大概就是数轴上有n个闭区间[ai, bi]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。

那拿到数据,我们为了可以实现贪心算法,首先要确定的就是贪心策略——让尽可能少的点落在尽可能多的区间上,也就是让尽可能多的区间有公共区间。为了实现这个目的,就必须让两个区间的交集大一点,也就是让一个区间的右端和下一个区间的左端拉开距离。从而引出我们的贪心策略:把区间按右端从小到大排,假如右端一样的话,按左端从大到小排序。

代码

#include <iostream>
#include <algorithm>
using namespace std;

struct interval
{
    int a;
    int b;
} intervals[666];

bool compare(interval j, interval k)
{

    if (j.a != k.a)
    {
        return j.b < k.b;
    }
    else
    {
        return j.a > k.a;
    }
}

int main()
{
    int n;
    cin >> n;

    for (int i = 0; i < n; i++)
    {
        cin >> intervals[i].a >> intervals[i].b;
    }

    sort(intervals, intervals + n, compare);

    int done = 0, ans = 0;
    while (done != n)
    {
        ans++;
        int p = intervals[done].b;

        while (1)
        {
            if (p >= intervals[done + 1].a && p <= intervals[done + 1].b)
                done++;
            else
                break;
        }
        done++;
    }


    cout << ans;
}

问题与结对

本章目前遇到的问题还好,基本上可以通过自己想或者网上查阅资料博文解决。

结对编程也是分工明确,状态良好,配合默契。

posted on 2020-11-15 02:12  ccqstark  阅读(85)  评论(0)    收藏  举报