#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(
"d:d:d d:d:d 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(
"d:d:d d:d:d ",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 d\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 d ",s_task.
i_start_id);
}
printf
(
"to ");
if(i_end_id
==
0)
{
printf(
"elevator\n");
}
else
{
printf(
"room d\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 d\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;
}
转载请注明原文地址: https://ju.6miu.com/read-679767.html