zoukankan      html  css  js  c++  java
  • 区间相交问题---贪心算法

    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;
    }
  • 相关阅读:
    [转载]「服务」WCF中NetNamedPipeBinding的应用实例
    [转载] ABP框架理论学习之后台工作(Jobs)和后台工作者(Workers)
    .NET Core use NLog
    把.netcore console 安装到Windows 系统服务。
    利用Linq Skip() Take()分页
    C#访问Java的WebService添加SOAPHeader验证的问题
    马丁福勒 关于微服务特点的描述
    转载 springboot 配置读取
    luajit与NYI
    lua启用lua-resty-core
  • 原文地址:https://www.cnblogs.com/xiaojuzibuxiao/p/7701117.html
Copyright © 2011-2022 走看看