《算法笔记》文章之 贪心算法 --区间贪心

区间贪心分为两种,1:最多区间不相交贪心     2:最少点在所有区间内贪心

先来看第一种贪心算法:最多区间不相交贪心

如:给定区间(1,3),(2,4),(3,5),(6,7) 从中选择尽可能多的区间让这些区间两两没有交集  (注意:这区间为开区间)。

情况一:一个大区间包括一个小区间:选择小区间

情况二:在情况一的条件下,区间按照y的值从大到小排序,那么每个区间不会和另外一个区间完全重复

实现思路有点需要注意:没有必要在输入时对情况一进行排查(虽然在情况二中很好用(手动滑稽))在进行排序的时候对cmp做一个小改动就好了(跳进去的坑,看了书上的解法感觉自己理解还是不深)

具体算法实现如下:

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1100;
struct node
{
    int x,y;
}A[1100];
bool cmp(node a,node b)
{
    if(a.x != b.x)
        return a.x>b.x;         /// 对x进行从大到小排序
    else
        return a.y<b.y;                        ///如果x相同,对y进行从小到大排序
}
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>A[i].x>>A[i].y;
    }
    sort(A,A+n,cmp);
    int cnt = 1;
    int indx = A[0].x;
    for(int i=1; i<n; i++)
    {
        if(A[i].y <= indx)
        {
            indx = A[i].x;
            cnt++;
        }
    }
    cout<<cnt<<endl;
}

接下来就是最少点在所有区间内贪心

代码部分只需要把

f(A[i].y <= indx)

的‘=’去掉即可

很神奇啊--我也在学习


猜你喜欢

转载自blog.csdn.net/qq_38851184/article/details/80271115