#include "iostream"
#include "fstream"
#include "algorithm"
using namespace std;
/*
首先对n个活动的2n个端点排序,然后从左到右扫描,遇到开始时刻s[i],将活动i安排在一个
空闲的会场中。遇到一个结束时刻f[i]就将活动i占用的会场释放。
*/
struct Point
{
int time; //时间
int isStart; //如果是开始时间,值为1,否则为0
bool operator < (const Point &p) const
{
return time < p.time;
}
};
Point point[50];
//n为活动个数
//返回使用最少会场个数
int greedy(int n)
{
sort(point, point+2*n); //按活动时间排序
int i;
int cur = 0;
int max = 0;
for(i=1; i<=n; i++)
{
if(point[i].isStart) //如果是开始时间
cur++; //安排会场
else
cur--; //释放会场
/*如果cur>max,point[i].time=point[i+1].time,point[i].time一定是
开始时间,point[i+1].time可能是开始时间,也可能是结束时间,如果是结束时间,
说明活动开始时间与结束时间相等,不需要会场,如果是开始时间,下次更新,
所以当cur>max && point[i].time=point[i+1].time,不进行处理
*/
if(n-1==i || point[i].time<point[i+1].time && cur>max)
max = cur;
}
return max;
}
int main()
{
ifstream fin("会场.txt");
int n;
cout << "输入活动个数:";
fin >> n; cout << n;
cout << "\n输入各个活动的开始时间和结束时间:\n";
int i;
for(i=1; i<=n*2; i+=2)
{
fin >> point[i].time >> point[i+1].time;
point[i].isStart = 1;
point[i+1].isStart = 0;
cout << point[i].time << " " << point[i+1].time;
cout << endl;
}
cout <<"\n最少会场数为:" << greedy(n);
cout << endl;
fin.close();
return 0;
}
会场安排问题
最新推荐文章于 2023-10-02 20:00:50 发布