离散事件模拟-银行管理——队列思想(双队列)

本文通过使用双队列模拟银行双窗口业务处理过程,探讨了如何计算顾客平均逗留时间,并对比了两种不同的实现方式,最终实现了正确解答。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Think:
1知识点:队列+模拟
2反思:
1、心态反思:实训结束不久,心态松懈,基础知识方面多次犯错,分析问题不深入、不全面
2、知识点反思:基础知识不牢固,关于运算符优先级方面知识需要提高
运算符优先级——百度百科
3、错误反思:不同时刻窗口的人数不一定相等
3题目分析:双队列模拟银行的双窗口,注意平均逗留时间的计算

以下为Wrong Answer代码——不同时刻窗口的人数不一定相等

#include <bits/stdc++.h>

using namespace std;

struct node {
    int Begin;
    int End;
}link_1, link_2;
int tp1, tp2;

int main(){
    int T, n, i, x, y;
    scanf("%d", &T);
    while(T--){
        scanf("%d", &n);

        double sum = 0;
        tp1 = tp2 = 0;
        link_1.Begin = link_1.End = 0;
        link_2.Begin = link_2.End = 0;

        for(i = 0; i < n; i++){
            scanf("%d %d", &x, &y);
            if(x < 0 || x > 360){
                continue;
            }
            if(tp1 <= tp2){
                if(tp1 == 0){
                    link_1.Begin = x;
                    link_1.End = x + y;
                }
                else {
                    if(x >= link_1.End){
                        sum += (double)(link_1.End - link_1.Begin);
                        link_1.Begin = x;
                        link_1.End = x + y;
                    }
                    else {
                        sum += (double)(link_1.End - link_1.Begin);
                        sum += (double)(link_1.End - x);
                        link_1.Begin = link_1.End;
                        link_1.End += y;
                    }
                    tp1--;
                }
                tp1++;
            }
            else {
                if(tp2 == 0){
                    link_2.Begin = x;
                    link_2.End = x + y;
                }
                else {
                    if(x >= link_2.End){
                        sum += (double)(link_2.End - link_2.Begin);
                        link_2.Begin = x;
                        link_2.End = x + y;
                    }
                    else {
                        sum += (double)(link_2.End - link_2.Begin);
                        sum += (double)(link_2.End - x);
                        link_2.Begin = link_2.End;
                        link_2.End += y;
                    }
                    tp2--;
                }
                tp2++;
            }
        }

        sum += (double)(link_1.End - link_1.Begin);
        sum += (double)(link_2.End - link_2.Begin);

        printf("%.2lf\n", sum/(n));
    }
    return 0;
}


/***************************************************
User name: 
Result: Wrong Answer
Take time: 0ms
Take Memory: 224KB
Submit time: 2017-07-13 20:34:04
****************************************************/

以下为Accepted代码

#include <bits/stdc++.h>

using namespace std;

struct node {
    int Begin;
    int End;
}link_1[104], link_2[104];
int op1, op2, tp1, tp2;

int main(){
    int T, n, i, x, y;
    scanf("%d", &T);
    while(T--){
        op1 = op2 = tp1 = tp2 = 0;
        double sum = 0;
        memset(link_1, 0, sizeof(link_1));
        memset(link_2, 0, sizeof(link_2));

        scanf("%d", &n);
        for(i = 0; i < n; i++){
            scanf("%d %d", &x, &y);
            while(op1 < tp1 && x >= link_1[op1].End){
                op1++;
            }
            while(op2 < tp2 && x >= link_2[op2].End){
                op2++;
            }
            if(op1 == tp1){
                link_1[tp1].Begin = x;
                link_1[tp1].End = x + y;
                tp1++;
                sum += (double)(y);
            }
            else if(op2 == tp2){
                link_2[tp2].Begin = x;
                link_2[tp2].End = x + y;
                tp2++;
                sum += (double)(y);
            }
            else if((tp1 - op1) <= (tp2 - op2)){
                link_1[tp1].Begin = link_1[tp1-1].End;
                link_1[tp1].End = link_1[tp1-1].End + y;
                sum += (double)(link_1[tp1].End - x);
                tp1++;
            }
            else if((tp1 - op1) > (tp2 - op2)){
                link_2[tp2].Begin = link_2[tp2-1].End;
                link_2[tp2].End = link_2[tp2-1].End + y;
                sum += (double)(link_2[tp2].End - x);
                tp2++;
            }
        }
        printf("%.2lf\n", sum/n);
    }
    return 0;
}


/***************************************************
User name: 
Result: Accepted
Take time: 0ms
Take Memory: 228KB
Submit time: 2017-07-13 21:15:51
****************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值