1025

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL错误1025通常表示出现了死锁问题,也就是多个事务同时请求相同资源导致互相等待。这种情况下,一个事务被阻塞,直到其他事务释放资源。常见的错误信息是 "LOCK wait timeout exceeded"。 解决这个问题的方法可以通过以下步骤来进行: 1. 首先,可以使用以下命令检查当前正在使用的表:`show OPEN TABLES where In_use > 0;`,以及查看当前的进程列表:`show processlist;`。这些命令可以帮助你确定是否有其他的进程正在使用相同的表或资源。 2. 如果第一步没有找到问题所在,可以使用以下命令查询InnoDB锁和等待信息:`SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;`和`SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;`。这些命令可以帮助你查看当前的锁定情况和等待情况。 3. 如果以上步骤还没有找到问题所在,可以参考这篇文章中的方法,使用`select * from information_schema.innodb_trx`命令找到未提交的事务,并通过`kill`命令终止该事务。 通过以上的方法,你应该能够解决MySQL错误1025的问题。如果问题仍然存在,你可能需要进一步检查你的数据库配置和应用程序代码,以确保没有其他潜在的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQL ERROR 1025 - Error on rename of ‘...‘ 和1005 - Can‘t create table ...中可能存在的问题](https://blog.csdn.net/impact_factor/article/details/119843261)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [mysql 1025 LOCK 死锁 解决](https://blog.csdn.net/opopopwqwqwq/article/details/79585010)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值