区间相交问题---贪心算法

1)问题描述:

  给定x 轴上n 个闭区间。去掉尽可能少的闭区间,使剩下的闭区间都不相交。

2)编程任务:

  给定n 个闭区间,编程计算去掉的最少闭区间数。

3)数据输入:

  第一行是正整数n,表示闭区间数。接下来的n行中,每行有2 个整数,分别表示闭区间的2个端点。

4)结果输出:

计算出的去掉的最少闭区间数。

5)输入示例

3

10 20

10 15

20 15

6)输出文件示例 

  2  

分析:输入x1,y1.x2,y2... ,[x1,y1]是一个区间,把每个区间以y为参照按照从小到大排序,然后再进行选择,比较xi和yi-1

#include <iostream>

using namespace std;
class Data{
public:
        int operator <=(Data a) const
        {
            return(f<=a.f);
        }
        int s,f;
};
void Sort(Data *d,int n)
{
    int i,j,flag;
    Data temp;

    for(i=1;i<=n;i++){
        flag = 0;
        for(j=n;j>i;j--){
            //如果前一个数大于后一个数,则交换
            if(d[j]<=d[j-1]){
                temp = d[j];
                d[j] = d[j-1];
                d[j-1] = temp;
                flag = 1;
            }
        }
        //如果本次排序没有进行一次交换,则break,减少了执行之间。
        if(flag == 0){
            break;
        }
    }
}
int GeedySelector(int n,int s[],int f[],bool a[])
{   Data *d=new Data[n];
    for(int i=1;i<=n;i++)
    {
        d[i].s=s[i];
        d[i].f=f[i];
    }
    Sort(d,n);
    /*for(int i=1;i<=n;i++)
    {
        cout<<d[i].f<<endl;
    }*/
    a[1]=true;
    int j=1;

    for(int i=2;i<=n;i++)
    {
        if(d[i].s>=d[j].f)
        {
            a[i]=true;
            j=i;

        }
        else{
                a[i]=false;
        }
    }
    int count=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]==true)
        {   cout<<"-----"<<endl;
            cout<<d[i].s<<" "<<d[i].f<<endl;
            count++;
        }

    }
    return count;
}
int main()
{   int n;
    cout<<"输入n"<<endl;
    cin>>n;
    cout<<"输入n组数据"<<endl;
    int s[100];
    int f[100];
    for(int i=1;i<=n;i++)
    {
        cin>>s[i];
        cin>>f[i];
    }
    bool a[n];
  int m=GeedySelector(n,s,f,a);
   cout<<"剩余区间的个数"<<m<<endl;
    return 0;
}

 

posted @ 2017-10-20 19:03  小橘子不小  阅读(3004)  评论(0编辑  收藏  举报