7-10 选点问题 (15分)

 

数轴上有n个闭区间[ai, bi]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。

输入格式:

第一行一个数字n,表示有n个闭区间。 下面n行,每行包含2个数字,表示闭区间[ai, bi]

输出格式:

一个整数,表示至少需要几个点

输入样例:

在这里给出一组输入。例如:

3
1 3
2 4
5 6

输出样例:

在这里给出相应的输出。例如:

2

代码:

#include <iostream>
#include<algorithm>
using namespace std;

typedef struct
{
    int start;
    int end;
    bool x=0;  //x=0表示未处理
}section;

bool complare(const section &a,const section &b){   //自己定义sort排序规则,按start从小到大排序
    return a.start<b.start;
}

int main(){
    
    //输入 
    int n;         //表示有n个闭区间
    cin>>n;
    section a[n+1]; //从1开始
    int count = 0;
    for(int i=1;i<=n;i++){
        cin>>a[i].start>>a[i].end;
    } 
    //排序
    sort(a+1,a+1+n,complare);

    //处理
    for(int i=1;i<=n;i++)
    {
        if( a[i].x == 1 ) continue;  
        int front = a[i].start;
        int back = a[i].end;
        for(int j=i+1;j<=n;j++)        //以第i个区间为基准,找后面的区间有多少个与a[i],若重叠,标记该区间,再取重叠部分继续往下找
        {
            if( a[j].x == 1 ) continue;
            if( a[j].start <= back )    // 头在区级 a【i】里面
            { 
                front = a[j].start;      
if(a[j].end<=back) back = a[j].end; //尾部也在区间 a[i] 里面 a[j].x = 1; // 已处理过,做标记1 } } count ++; a[i].x = 1; // 可以去掉 } cout<<count<<endl; return 0; }

 

上一篇:configparser模块


下一篇:P1182 数列分段 Section II