Loading

Greedy

基本思想

局部最优叠加-》整体最优

区间贪心

区间不相交问题

问题描述

给出N个开区间(x,y),从中尽可能多得选取开区间,使得这些开区间两两没有交集。

做法

总是先选择左端点较大的区间。

代码实现

#include<stdio.h>
#include<algorithm>
using namespace std;
struct Node
{
    int x, y;
}Intevals[100];
bool cmp(Node a, Node b)
{
    if(a.x != b.x) return a.x > b.x;
    else return a.x < b.x;
}

int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 0; i<n; i++)
    {
        scanf("%d%d", &Intevals[i].x, &Intevals[i].y);
    }
    sort(Intevals, Intevals+n, cmp);
    int count = 1;
    int X = Intevals[0].x;
    for(int i = 1; i<n; i++)
    {
        if(Intevals[i].y <= X)
        {
            X = Intevals[i].x;
            count++;
        }
    }
    printf("%d\n", count);
    return 0;
}

区间选点问题

问题描述

给出N个闭区间[x,y],求最少需要确定多少个点,才能使每个区间中最少存在一个点。

做法

修改区间不相交问题的代码:
'Intervals[i].y <= X' -> 'Intervals[i].y < X'

posted @ 2021-10-25 23:27  咪啪魔女  阅读(206)  评论(0编辑  收藏  举报