描述
学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动。现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排。
输入第一行是一个整型数m(m<100)表示共有m个活动。
随后的m行,每行有两个正整数Bi,Ei(0<=Bi,Ei<10000),分别表示第i个活动的起始与结束时间(Bi<=Ei) 输出输出最多能够安排的活动数量。
样例输入
15 4 8 2 5 2 6 4 6 2 3 1 6 4 7 3 5 3 8 1 2 1 7 2 4 5 6 4 5 7 8样例输出
5
提示 注意:如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始
由于这题是完全按照自己的想法来写的,可能有考虑不全的情况,欢迎讨论。
主要思想:
结构体event纪录了活动开始时间/结束时间,是否被安排以及安排在那个房间
由vec保存这一连串的活动,timing纪录哪个会议室被安排到几点。
1.找出vec里开始时间最早的活动;
2(1).判断timing是否为空,为空直接安排(把该活动结束push进timing里,活动安排标志位置1)
2(2):若不为空,遍历timing寻找是否有会议室结束使用时间早于该活动开始时间,有则安排进该会议室(更新timing已有元素=该活动结束时间);若没有,则需要另开一个会议室(往timing push进新元素,该元素为活动结束时间);
3.循环步骤1、2直到所有活动都被安排(被安排标识符全部为1);
#include <iostream>
#include <vector>
using namespace std;
struct event{
int starttime;
int endtime;
bool settled;
int room_num;
}
bool sorted(vector<struct event>& vec,vector<int>& timing){
if(vec.empty()) return false;
int num = 0;
int num2 = 0;
bool res = false;
for(vector<struct event>::iterator i=vec.begin();it<vec.end();i++){
if(!i->settled) break;
num++;
}
if(num==vec.size()) return true;
int frist = vec[num].starttime;
for(int i=0;i<vec.size();i++){
if(vec[i].starttime<=frist && !settled){
first = vec[i].starttime;
num = i;
}
}
if(timing.empty()){
timing.push_back(vec[num].endtime);
vec[num].room_num = timing.size()-1;
vec[num].settled = true;
}else{
for(vector<int>::iterator it=timing.begin();it<timing.end();it++){
if(*it<=first){
*it = vec[num].endtime;
vec[num].room_num = num2;
vec[num].settled = true;
}
num2++;
}
if(num2==timing.size()){
timing.push_back(vec[num].endtime);
vec[num].room_num = timing.size()-1;
vec[num].settled = true;
}
}
res = sorted(vec,timing);
return res;
}
int main() {
vector<struct event> activity;
vector<int> timing;
sorted(activity,timing);
cout << "test\n";
return 0;
}