1025

    xiaoxiao2021-12-02  24

    #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

    最新回复(0)