zoukankan      html  css  js  c++  java
  • PTA-7-18 银行排队模拟(归并排序的简单应用)

    这个题是归并排序的一个简单应用,只需要掌握好归并排序的思想,代码很容易写出。

    设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。

    输入格式:

    输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。

    输出格式:

    按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。

    输入样例:

    8 2 1 3 9 4 11 13 15
    

    输出样例:

    1 3 2 9 11 4 13 15
    
    1. 对于本题,我们首先需要记录每个顾客对应的结束时间,同时需要保存用户的id,我们使用一个结构体来保存。
    struct Person
    {
        int id, endTime;
    } lineA[maxn], lineB[maxn];	// 分别表示 A 队伍的人和 B 队伍的人
    
    1. 然后我们使用两个全局变量 timeA,timeB 保存两个队伍当前已经经过的时间
    2. 在输入时就可以计算好所有人的结束时间后,使用归并排序将两队结果输出
      完整代码如下:
    /*
        Author: Veeupup
        银行业务队列简单模拟
    
        A 的速度是 B 的两倍,根据处理顺序输出
        分别计算出 每个人结束的事件,归并到一起
    
     */
    #include <iostream>
    #include <cstdio>
    #include <cstdint>
    #include <vector>
    #define LOCAL
    using namespace std;
    
    const int maxn = 1010;
    
    struct Person
    {
        int id, endTime;
    } lineA[maxn], lineB[maxn];
    
    int timeA = 0, timeB = 0; // A 和 B 当前结束的时间
    int numA = 0, numB = 0;
    
    int main()
    {
        #ifdef LOCAL
        freopen("data.txt", "r", stdin);
        #endif
        int n, tempId; // 总人数
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &tempId);
            if (tempId % 2 == 1)
            {
                timeA++;
                lineA[numA].id = tempId;
                lineA[numA++].endTime = timeA;
            }
            else
            {
                timeB += 2;
                lineB[numB].id = tempId;
                lineB[numB++].endTime = timeB;
            }
        }
        // 开始归并
        int i = 0, j = 0;  // i 代表 A 的编号,j 代表 B 的编号
        bool flag = false; // 控制输出格式
        int nowTimeA, nowTimeB, nowId;
        while (i < numA && j < numB)
        {
            int nowTimeA = lineA[i].endTime;
            int nowTimeB = lineB[j].endTime;
            if (lineA[i].endTime <= lineB[j].endTime)
            {
                nowId = lineA[i++].id;
            }
            else
            {
                nowId = lineB[j++].id;
            }
            if (flag)
            {
                printf(" %d", nowId);
            }
            else
            {
                printf("%d", nowId);
                flag = true;
            }
        }
        while (i < numA)
        {
            if (flag)
            {
                printf(" %d", lineA[i++].id);
            }
            else
            {
                printf("%d", lineA[i++].id);
            }
        }
        while (j < numB)
        {
            if (flag)
            {
                printf(" %d", lineB[j++].id);
            }
            else
            {
                printf("%d", lineB[j++].id);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    spring源码学习之容器的扩展(二)
    spring源码学习之容器的扩展(一)
    spring源码学习之bean的加载(三)
    spring源码学习之bean的加载(二)
    Linux find命令使用正则表达式
    Linux获取两个路径之间的相对路径
    利用linux sort命令比较版本号
    yum只下载不安装软件包
    tar命令排除某个文件夹
    ssh远程执行命令的符号转义问题
  • 原文地址:https://www.cnblogs.com/veeupup/p/12614399.html
Copyright © 2011-2022 走看看