码迷,mamicode.com
首页 > 其他好文 > 详细

7-10 选点问题 (15分)

时间:2020-11-08 17:54:04      阅读:26      评论:0      收藏:0      [点我收藏+]

标签:column   问题   csharp   输入   输入格式   flex   ios   wrap   for   

 

数轴上有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; }

 

7-10 选点问题 (15分)

标签:column   问题   csharp   输入   输入格式   flex   ios   wrap   for   

原文地址:https://www.cnblogs.com/lvjingyuan/p/13943983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!