#include <stdio.h>
#include <list>
#include <math.h>
//电梯每5秒可以让一个人进去。
//就实际情况来说逻辑是有问题的,在这里不考究。
enum TTaskType{
start,end,wait,stay,out
};
//位置编号。1楼1室 0101,1楼100 电梯0 外面1
typedef struct STask{
TTaskType type;
int i_need_time;//0表示未知,不知道等多久
int i_start_id;//开始编号
int i_end_id;//目标编号
int i_start_time;//0表示还没有开始
}STask;
typedef struct SAgentInfo{
unsigned char c_lv;//'A'~'Z' 'A'最高
std::list<STask> list_ready_do;
std::list<STask> list_history_do;
int i_start_time;
int i_next_task_time;
STask s_doing_task;//正在做的事
}SAgentInfo;
std::list<SAgentInfo*> list_agents;
SAgentInfo* list_finish_agent[26] = {NULL};
//标记每一个房间下次空闲的时间
SAgentInfo* fFindFrontAgent()
{
std::list<SAgentInfo*>::iterator it = list_agents.begin();
SAgentInfo* p_ret = *it;
while(++it != list_agents.end())
{
SAgentInfo* p_agent = *it;
if(p_agent->i_next_task_time < p_ret->i_next_task_time
||(p_agent->i_next_task_time == p_ret->i_next_task_time
&& p_agent->c_lv < p_ret->c_lv))
{
p_ret = p_agent;
}
}
return p_ret;
}
STask fMakeTask(TTaskType type,int i_need_time,int i_start_id,int i_end_id,int i_start_time = 0)
{
STask s_ret = {type,i_need_time,i_start_id,i_end_id,i_start_time};
return s_ret;
}
void fOutLog(SAgentInfo* p_agent)
{
printf("%c\n",p_agent->c_lv);
while(p_agent->list_history_do.empty()==false)
{
STask s_task = p_agent->list_history_do.front();
p_agent->list_history_do.pop_front();
if(s_task.i_need_time == 0)
{
continue;
}
if (p_agent->list_history_do.empty())
{
printf("%02d:%02d:%02d %02d:%02d:%02d Exit\n",
s_task.i_start_time/3600,(s_task.i_start_time%3600)/60,s_task.i_start_time%60,
(s_task.i_start_time+30)/3600,((s_task.i_start_time+30)%3600)/60,(s_task.i_start_time+30)%60);
}else
{
//time
printf("%02d:%02d:%02d %02d:%02d:%02d ",s_task.i_start_time/3600,(s_task.i_start_time%3600)/60,s_task.i_start_time%60,
(s_task.i_start_time+s_task.i_need_time)/3600,((s_task.i_start_time+s_task.i_need_time)%3600)/60,(s_task.i_start_time+s_task.i_need_time)%60);
switch(s_task.type)
{
case start:
printf("Entry\n");
break;
case stay:
if(s_task.i_end_id == 0)
{
printf("Stay in elevator\n");
}else
{
printf("Stay in room %04d\n",s_task.i_end_id);
}
break;
case out:{
STask s_next_task = p_agent->list_history_do.front();
int i_end_id = s_next_task.i_end_id;
printf("Transfer from ");
if(s_task.i_start_id == 0)
{
printf("elevator ");
}else
{
printf("room %04d ",s_task.i_start_id);
}
printf ("to ");
if(i_end_id == 0)
{
printf("elevator\n");
}else
{
printf("room %04d\n",i_end_id);
}
break;
}
case wait:
if(s_task.i_end_id == 0)
{
printf("Waiting in elevator queue\n");
}else
{
printf("Waiting in front of room %04d\n",s_task.i_end_id);
}
break;
case end:
break;
}
}
}
printf("\n");
}
int main()
{
int i_room_free_time[1011] = {0};
while(true)
{
SAgentInfo* s_agent = new SAgentInfo();
int h,m,s;
scanf("%c",&s_agent->c_lv);
if(s_agent->c_lv == '.')
{
break;
}
list_finish_agent[s_agent->c_lv-'A'] = s_agent;
scanf("%d:%d:%d\n",&h,&m,&s);
s_agent->i_start_time = h*3600+m*60+s;
int i_location_id = 100;
s_agent->i_next_task_time = s_agent->i_start_time+30;
s_agent->s_doing_task = fMakeTask(start,30,100,100,s_agent->i_start_time);
while(true)
{
//总是在某层的大厅中
int i_room_id,i_stay_time;
scanf("%d",&i_room_id);
if(i_room_id == 0){
scanf("\n");
break;
}
scanf("%d\n",&i_stay_time);
int i_dif_lv = abs(i_room_id/100 - i_location_id/100);
if(i_dif_lv != 0)
{//要去坐电梯
s_agent->list_ready_do.push_back(fMakeTask(wait,0,i_location_id,0));
s_agent->list_ready_do.push_back(fMakeTask(stay,30*(abs(i_dif_lv)),0,0));
i_location_id = i_room_id-i_room_id%100;
s_agent->list_ready_do.push_back(fMakeTask(out,10,0,i_location_id));
}
s_agent->list_ready_do.push_back(fMakeTask(wait,0,i_location_id,i_room_id));
s_agent->list_ready_do.push_back(fMakeTask(stay,i_stay_time,i_room_id,i_room_id));
s_agent->list_ready_do.push_back(fMakeTask(out,10,i_room_id,i_location_id));
}
if(i_location_id != 100)
{
int i_dif_lv = abs(i_location_id/100-1);
s_agent->list_ready_do.push_back(fMakeTask(wait,0,i_location_id,0));
s_agent->list_ready_do.push_back(fMakeTask(stay,30*(abs(i_dif_lv)),0,0));
s_agent->list_ready_do.push_back(fMakeTask(out,10,0,100));
}
s_agent->list_ready_do.push_back(fMakeTask(end,30,100,1));
list_agents.push_back(s_agent);
}
while(list_agents.empty() == false)
{
SAgentInfo* p_run_agent = fFindFrontAgent();
//可能是手头上的事做完了。如果time!=0就表示做完了
if(p_run_agent->s_doing_task.i_need_time == 0)
{
if(i_room_free_time[p_run_agent->s_doing_task.i_end_id]
<= p_run_agent->i_next_task_time)
{
if(p_run_agent->s_doing_task.i_end_id == 0
&&p_run_agent->i_next_task_time%5!=0)
{
i_room_free_time[p_run_agent->s_doing_task.i_end_id] =p_run_agent->i_next_task_time - p_run_agent->i_next_task_time%5 + 5;
continue;
}else
{
p_run_agent->s_doing_task.i_need_time = p_run_agent->i_next_task_time - p_run_agent->s_doing_task.i_start_time;
}
}else
{
p_run_agent->i_next_task_time = i_room_free_time[p_run_agent->s_doing_task.i_end_id];
continue;
}
}
if(p_run_agent->s_doing_task.type == end)
{
list_agents.remove(p_run_agent);
continue;
}
p_run_agent->list_history_do.push_back(p_run_agent->s_doing_task);
p_run_agent->s_doing_task = p_run_agent->list_ready_do.front();
p_run_agent->list_ready_do.pop_front();
p_run_agent->s_doing_task.i_start_time = p_run_agent->i_next_task_time;
p_run_agent->i_next_task_time += p_run_agent->s_doing_task.i_need_time;
if (p_run_agent->s_doing_task.type == stay)
{//elevator需要特殊处理,每个人实际只占用5s
if(p_run_agent->s_doing_task.i_end_id == 0)
{
i_room_free_time[p_run_agent->s_doing_task.i_start_id] = 5 + p_run_agent->i_next_task_time - p_run_agent->s_doing_task.i_need_time;
}else
{
i_room_free_time[p_run_agent->s_doing_task.i_start_id] = p_run_agent->i_next_task_time;
}
}
}
for(int i = 0;i<26;++i)
{
if(list_finish_agent[i] == NULL)
{
continue;
}
fOutLog(list_finish_agent[i]);
}
return 0;
}