区间相交问题---贪心算法
(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; }