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