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