线段覆盖

线段覆盖

题目描述:
n+e最近在研究线段覆盖问题。
n+e有n条线段和⼀个数轴,数轴⽆限长,每条线段在数轴上都有⼀个固定起点si和固定终点ei,其中si和ei都是整数。
放在数轴上的线段不能重合,不能重合定义为:对于两条不同线段(不妨设为第i条和第j条),⼀定要满⾜si≥ej或ei≤sj。
现在n+e将线段放在数轴上,请问他最多能在数轴上放多少线段?
输入:
第⼀⾏1个数n,表示线段数。
接下来2到n+1⾏,每⾏两个数,依次表示si和ei。
输出:
输出⼀⾏表示最多能放多少线段。
样例输入:
5
2 4
1 12
4 5
7 10
7 8
样例输出:
3
提示 :
对于30%数据,1≤n≤20
对于60%数据,1≤n≤1000
对于100%数据,1≤n≤50000,1≤si,ei≤1e8
线段覆盖问题,又称线段的最大相容问题,其贪心思想为:
右端点相同的,选长度短的排在前面;不相同的,则升序排列,最后遍历一遍,后面一个的左端点若大于等于前面一个的右端点,则说明二者兼容,最终答案加一。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct STU
{
    int a,b;
} stu[50005];
bool cmp(STU x,STU y)
{
    return x.b<y.b;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>stu[i].a>>stu[i].b;
    }
    sort(stu+1,stu+1+n,cmp);
    int ans=0,r=0;
    for(int i=1;i<=n;i++)
    {
        if(stu[i].a>=r)
        {
            ans++;
            r=stu[i].b;
        }
    }
    cout<<ans<<endl;
    return 0;
}
线段覆盖线段覆盖 suol,,,明灵 发布了66 篇原创文章 · 获赞 15 · 访问量 6568 私信 关注
上一篇:2020美赛总结回顾


下一篇:2019最新EI源刊目录