區間相交問題---貪心算法


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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM