贪心—最大区间不相交问题

加强版:https://blog.csdn.net/yanzhenhuai/article/details/81125165


思考一个这样的问题:

给出 n n 条区间的起点和终点(输入保证所有区间都是起点<终点),问最多可以选出多少个区间使得这些区间两两无交集(可以某区间的终点与另一区间的起点相同)。

由于这是贪心的一个经典模型所以直接讲解法不再赘述其他东西。

我们先将这n个区间按照终点(边界的右端点)为第一关键字从小到大排序。
假设 End E n d 为当前已经覆盖的终点(初始化 End=1 E n d = − 1 ),然后我们将排完序的区间扫一遍,如果当前的区间的右端点 >=End >= E n d ,我们就添加此区间并且更新 End E n d

由于这个贪心的正确性过于明显,就不再赘述。

参考代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define SG string
#define DB double
using namespace std;
const int Max=1e5+5;
struct Node{
    int X,Y;
}G[Max];
int T,N,End,Ans;
inline int Read(){
    int X=0;char CH=getchar();bool F=0;
    while(CH>'9'||CH<'0'){if(CH=='-')F=1;CH=getchar();}
    while(CH>='0'&&CH<='9'){X=(X<<1)+(X<<3)+CH-'0';CH=getchar();}
    return F?-X:X;
}
inline void Write(int X){
    if(X<0)X=-X,putchar('-');
    if(X>9)Write(X/10);
    putchar(X%10+48);
}
bool Cmp(Node P,Node Q){
    return P.Y==Q.Y?P.X<Q.X:P.Y<Q.Y; 
}
int main(){
    int I,J,K;
    T=Read();
    while(T--){
        End=-1;Ans=0;
        N=Read();
        for(I=0;I<N;I++){
            G[I].X=Read();
            G[I].Y=Read();
        }
        sort(G,G+N,Cmp);
        for(I=0;I<N;I++){
            if(G[I].X>=End){//如果不能首位相连就去掉=
                Ans++;End=G[I].Y;
            }
        }
        Write(Ans);putchar('\n');
    }
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值