贪心线段问题总结

贪心线段问题总结

1.不交集线段最大数问题

https://www.luogu.com.cn/problem/P1803

思路:可以对( l, r )的r排序,每次取最小的r,并判断相对应的l是否合法

```

#include <bits/stdc++.h>

using namespace std;

const int N=1e6;

struct Node{

int f,e;

}a[N];

bool cmp(Node x,Node y){

if(x.e!=y.e)return x.e<y.e;

else return x.f<y.f;

}

int main(){

std::ios_base::sync_with_stdio(false);

int n,num=1;

cin>>n;

for(int i=1;i<=n;i++){

cin>>a[i].f>>a[i].e;

}

sort(a+1,a+1+n,cmp);

int h=a[1].e;

for(int i=1;i<=n;i++){

if(h<=a[i].f){

num++;

h=a[i].e;

}

}

cout<<num<<endl;

return 0;

}

```

2.区间选点问题

简要概括题意:给你一些线段,求最小的点数,保证每个区间内至少有一的个点

思路:可以对( l , r )的r进行从小到大的排序,对于一个区间要添加一个点,而这个点肯定越往后越优,对于每一个区间,去判断其相应的( l , r )是否与前一个添加的点的区间有交集,

1 如果有,那么就可以保证可以与前一个区间共用一个点,不需要操作

2 如果没有,那么就不可以保证可以与前一个区间共用一个点,因此他必须添加一个点

3.区间覆盖问题

题意:给你一些线段,求用最少的线段数可以覆盖整个区间

思路:我们可以知道我们要尽量的去选有交集(包括r1=l2的情况)的线段中更长的显然是更优的

把( l , r )中的l从小到大排序,对于l相同的情况,再按r从小到大排序,设置一个变量表示已覆盖到的区间右端点,在剩下的线段中找出所有左端点小于等于当前已覆盖到的区间右端点的线段,选择右端点最大并且大于当前已覆盖到的区间右端点,重复以上操作直至覆盖整个区间;

posted @ 2026-01-20 23:28  kksc111  阅读(0)  评论(0)    收藏  举报