//某大学有n门课程要使用同一间教室上课,设计一个算法找出容纳尽量多的课程上课
//使用贪婪算法
#include<iostream>
#include<vector>
#include<algorithm>using namespace std;
const int n=12; //课程总数
typedef struct
{
int i; //课程序号
int s; //课程开始时间
int f; //课程结束时间
}Course;class LessThan
{
public:
bool operator()(const Course& c1,const Course& c2)
{
int a,b;
a=c1.f-c1.s; //课程完成时间
b=c2.f-c2.s;
return a<=b;
}
};

//检查两门课程排课时间是不是冲突,如果不冲突,函数返回真
bool Compatability(const Course& c1,const Course& c2)
{
if(c1.f<=c2.s || c2.f<=c1.s) return true;
else return false;
}void CouseScheduler(const vector<Course>&c,vector<Course>&maxCourse)
{
vector<Course>::const_iterator it=c.begin();
maxCourse.push_back(*it); //将排序好的第一门课程加入最大兼容课程集合
it++;
while(it!=c.end())
{
vector<Course>::const_iterator it1;
for(it1=maxCourse.begin();it1!=maxCourse.end();it1++) //检查it所指的课程和最大兼容课程集合是不是存在冲突
{
if(!Compatability(*it1,*it)) break;
}
if(it1==maxCourse.end()) maxCourse.push_back(*it);
*it++;
}
}void main()
{
vector<Course>c;
int i;
Course course;
for(i=0;i<n;i++) //检查输入合法性
{
cout<<"请输入第"<<i+1<<"门课程的开始时间:";
course.i=i+1;
cin>>course.s;
if(!cin.good())
{
throw runtime_error("输入异常!");
}
if(course.s<0)
{
cerr<<"输入应该大于等于0的数!"<<endl;
course.s=0;
i--;
continue;
}
cout<<"请输入第"<<i+1<<"门课程的结束时间:";
cin>>course.f;
if(!cin.good())
{
throw runtime_error("输入异常!");
}
if(course.f<0)
{
cerr<<"输入应该大于等于0的数!"<<endl;
course.f=0;
i--;
continue;
}
if(course.f<=course.s)
{
cerr<<"结束时间应该大于开始时间!"<<endl;
i--;
continue;
}
c.push_back(course);
}
sort(c.begin(),c.end(),LessThan()); //按照课程完成时间对所有课程排序
vector<Course>::const_iterator it;
for(it=c.begin();it!=c.end();it++)
{
cout<<"课程编号:"<<it->i<<endl;
cout<<"开始时间是:"<<it->s<<endl;
cout<<"结束时间是:"<<it->f<<endl;
cout<<"课程完成时间是:"<<it->f-it->s<<endl;
}
vector<Course>maxCourse;
CouseScheduler(c,maxCourse);
cout<<"最大兼容课程集合是:"<<endl;
for(it=maxCourse.begin();it!=maxCourse.end();it++)
{
cout<<"课程编号:"<<it->i<<endl;
cout<<"开始时间是:"<<it->s<<endl;
cout<<"结束时间是:"<<it->f<<endl;
cout<<"课程完成时间是:"<<it->f-it->s<<endl;
}
}