PAT (Advanced Level) Practice 1014 Waiting in Line

本文介绍了一个模拟银行排队系统的算法实现,通过结构体定义每个窗口的序列,包括最前面和最后面人的结束时间,以及每位顾客的需求时间。文章详细解释了如何处理客户排队逻辑,包括在黄线前的客户按顺序排队,以及黄线后的客户选择较短队伍加入的过程。

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805498207911936

题目说的比较清楚,模拟银行的排队系统,在黄线前的客户排好队,而且不能随意更换自己的位置,在黄线外的客户在未开始排队时是一个随意的状态,而且盯着哪个队伍比较短,就去那里排队。

输入:n窗口的数目,m黄线前的客户数量最大值,k客户总数,q需要查询的客户数,接下来k个数代表k个客户的时间,再起一行是需要查询客户的编号。

输出:每一位需要查询的客户的结束时间,如果这个时间在8:00~17:00之间,输出即可,否则输出Sorry。

这里使用一个结构体模拟窗口前的队列,poptime是队列第一个人的结束时间,endtime是队列最后一个人的结束时间,下面是代码:

#include <iostream>
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
struct node{               //结构体定义每个窗口的序列
    int poptime,endtime;  //poptime最前面人的结束时间,endtime最后面人结束的时间
    queue<int> q;          //保存每一位顾客的需求时间

};
int main()
{
    int n,m,k,q,index = 1;                  //index?
    scanf("%d%d%d%d",&n,&m,&k,&q);          //各个参数
    vector<int> time(k+1), result(k+1);      //time保存每个人的需求时间,result存的是最终的结束时间
    for(int i =1; i <= k; i++){
        scanf("%d",&time[i]);                // 输入需求时间
    }
    vector<node> window(n+1);        //窗口结构体
    vector<bool> sorry(k+1,false);     //判断是否超过17:00
    for(int i = 1; i <= m; i++){        //安排前m*n的人
        for(int j = 1; j <= n; j++){
            if(index <= k){             // 当前的人数小于客户总数,就是说客户总数大于m*n
                window[j].q.push(time[index]);  //压入当前的时间消耗
                if(window[j].endtime >= 540)      //大于17:00
                    sorry[index] = true;
                window[j].endtime += time[index];   //此队列的最后时间要加上入队的时间
                if(i == 1){                        //最靠近窗口的那一行人
                    window[j].poptime = window[j].endtime;
                }
                result[index] = window[j].endtime;  //记录下当前人的结束时间保存在result中,并且是提前计算出来
                index++;
            }
        }
    }
    while(index <= k){                //当前人数大于m*n但是小于总人数
        int tempmin = window[1].poptime,tempwindow = 1;   //寻找最早结束的时间,并且重复寻找
        for(int i = 2; i <= n; i++){    //
            if(window[i].poptime < tempmin){     //寻找最早结束时间的队列索引
                tempwindow = i;
                tempmin = window[i].poptime;
            }
        }
        window[tempwindow].q.pop();         //将存的time[index]弹出去
        window[tempwindow].q.push(time[index]);   //再压入当前的time
        window[tempwindow].poptime += window[tempwindow].q.front();   //此队列最早时间往后拖延
        if(window[tempwindow].endtime >= 540) sorry[index] = true;
        window[tempwindow].endtime += time[index];        //记录当前的最迟时间
        result[index] = window[tempwindow].endtime;      //提前计算出耗时,保存起来。
        index++;
    }
    for(int i = 1; i <= q; i++){
        int query,minute;
        scanf("%d",&query);
        minute = result[query];
        if(sorry[query] == true){
            printf("Sorry\n");
        }
        else{
            printf("%02d:%02d\n",(minute+480)/60,(minute+480)%60);
        }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/huhusw/p/9523252.html

内容概要:本文围绕含氢气氨气的综合能源系统优化调度展开研究,提出了一种基于Matlab的仿真建模与优化方法,旨在实现多能互补、高效利用与低碳运行。研究构建了包含风能、太阳能、电解水制氢、氢气储存、氢合成氨、氨储存及能源转换设备在内的综合能源系统架构,重点考虑了氢、氨作为二次能源载体在能量存储与转化中的关键作用。通过建立系统各组件的数学模型,如电解槽效率模型、合成氨反应动力学模型、储氢储氨容量模型等,并结合可再生能源出力不确定性、负荷需求波动等因素,构建了以系统运行成本最小化、碳排放最小化或多目标综合最优为目标的优化调度模型。采用智能优化算法(如改进粒子群算法、多目标优化算法等)对模型进行求解,实现了对系统中各类设备出力、储能充放电状态、能量交互功率等变量的精细化调度,有效提升了能源利用效率与系统经济性。; 适合人群:具备一定电力系统、能源工程或自动化专业背景,熟悉Matlab/Simulink仿真工具,从事新能源、综合能源系统、氢能等领域研究的研发人员、研究生及高年级本科生。; 使用场景及目标:① 为含氢、氨等新型能源载体的综合能源系统规划设计提供理论依据和技术支撑;② 实现对风光等波动性可再生能源的高效消纳,提高系统灵活性与可靠性;③ 通过优化调度降低系统运行成本与碳排放强度,服务于“双碳”战略目标。; 阅读建议:此资源以Matlab代码实现为核心,提供了完整的仿真模型与优化算法代码,学习者应结合相关专业知识,深入理解模型构建的物理意义与数学表达,调试并运行代码以掌握其工作流程,进而可根据实际需求对模型进行扩展与改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值