教室规划问题

//某大学有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;
 }
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值