7-2 谁先打饭(PTA数据结构练习—队列的应用)

文章讨论了如何使用C++实现一个算法,根据不同编号分配到不同窗口,并修正了奇数编号全来时的输出格式问题。
摘要由CSDN通过智能技术生成

7-2 谁先打饭

分数 30     作者  陈晓梅      单位  广东外语外贸大学

设饭堂有K1、K2两个打饭的窗口,窗口内工作人员的打饭速度不一样,K1打一份饭的速度是K2的2倍,也就是说K1师傅服务完两位同学,K2师傅才服务完一位同学。
题目按照先后顺序给出学生们来到饭堂的序列,请按照打饭完成的顺序输出学生序列。若两个窗口同时服务完2位同学,先输出K1窗口的同学。

输入格式:

输入有两行:
第一行是n值,表示有n位同学来到饭堂;
第二行有n个数,代表n位同学的编号,其中奇数编号将要去K1窗口打饭,偶数编号将要去K2窗口打饭。

输出格式:

按照打饭完成的顺序输出编号序列,以空格分隔,行末不能有空格。

修改前的代码:

 

如上图所示,若测试用例全为奇数,运行结果中,空格的位置出现错误,有些数据前缺少了空格。

#include <iostream>
#include <queue>

using namespace std;

struct Student {
    int id;
    int order;             // 用来表示学生打饭的顺序
};

int main() {
    int n;
    cin >> n;

    queue<Student> k1, k2; // 分别表示两个窗口的队列

    for (int i = 0; i < n; ++i) {
        int studentId;
        cin >> studentId;

        if (studentId % 2 == 1) { // 奇数编号去K1窗口
            k1.push({studentId, i});
        } else { // 偶数编号去K2窗口
            k2.push({studentId, i});
        }
    }

    while (!k1.empty() || !k2.empty()) {
        if (!k1.empty()) {
            cout << k1.front().id;
            k1.pop();

            if (!k1.empty()) {
                cout << " " << k1.front().id;
                k1.pop();
            }

            if (!k2.empty()) {
                cout << " ";
            }
        }

        if (!k2.empty()) {
            cout << k2.front().id;
            k2.pop();

            if (!k2.empty() || !k1.empty()) {
                cout << " ";
            }
        }
    }

    cout << endl;

    return 0;
}

修改方法:增加一条针对编号全为奇数的情况:

if(!k1.empty()&&k2.empty()) {   //若学生编号全为奇数
    cout << k1.front().id;
    k1.pop();
    if (!k1.empty()) 
        cout << " ";
    continue;            
}

修改后的结果: 

#include <iostream>
#include <queue>
using namespace std;
struct Student {
    int id;
    int order;                  // 用来表示学生打饭的顺序
};

int main() {
    int n;
    cin >> n;

    queue<Student> k1, k2;       // 分别表示两个窗口的队列

    for (int i = 0; i < n; ++i) {
        int studentId;
        cin >> studentId;

        if (studentId % 2 == 1) {      // 奇数编号去K1窗口
            k1.push({studentId, i});
        } else { // 偶数编号去K2窗口
            k2.push({studentId, i});
        }
    }

    while (!k1.empty() || !k2.empty()) {
        if(!k1.empty()&&k2.empty()) {   //若学生编号全为奇数
            cout << k1.front().id;
            k1.pop();
            if (!k1.empty()) {
                cout << " ";
            continue;            
            }
        }
        if (!k1.empty()) {             //若学生编号不全为奇数
            cout << k1.front().id;
            k1.pop();
            if (!k1.empty()) {
                cout << " " << k1.front().id;
                k1.pop();
            }
            if (!k2.empty()) {
                cout << " ";
            }
        }
        if (!k2.empty()) {
            cout << k2.front().id;
            k2.pop();

            if (!k2.empty() || !k1.empty()) {
                cout << " ";
            }
        }
    }
    return 0;
}

 

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值