银行有26个人排队,宽度只能一个人站立

OIER银行只有一个窗口,进去取钱的人们必须沿直线整齐排队,整条队只可以容得下
26
26 个人,而且宽度只能够一个人站立,所以OIER们排得不耐烦走人是很困难的。
如果这人是在中间,那么必须前面所有人离开或后面所有人离开,然后这个人走掉,再重新恢复队伍。当然,如果前面的人少,就前面的人退出去;如果后面的人少,就后面的人退出来,如果那个要走的人在中间,即前后人一样多,就前面的人退出来,让这个人走掉。
如我们给从前到后的人标号为ABCDEF,那么C要走,A和B须从前面退出来,C才能够离开,然后先退出去的人先进(注意顺序是反的),队伍变成了BADEF,如果是D要走,那么E和F退出去再进来,变为ABCFE。
在要求你编写程序,打印此过程。
c++代码

img

题主,这个问题我来替你解决(参考结合AI智能、文心一言),若有帮助,还望采纳,点击回答右侧采纳即可。


思路:首先将所有人存入队列中,然后每次取出队列中的第26个人,如果这个人是中间的人,则根据前后人的数量来确定谁先退出队列,然后再重新排队。重复以上步骤直到队列为空。

代码如下:

#include <iostream>
#include <vector>
 
void printQueue(const std::vector<char>& queue) {
    for (char person : queue) {
        std::cout << person;
    }
    std::cout << std::endl;
}
 
int main() {
    std::vector<char> queue = {'A', 'B', 'C', 'D', 'E', 'F'}; // 初始队伍
    std::vector<char> leaveOrder; // 记录离开的顺序
 
    // 依次离开队伍的人
    while (!queue.empty()) {
        int middle = queue.size() / 2; // 队伍中间位置
        char leavingPerson = queue[middle]; // 要离开的人
 
        // 前面的人数少于或等于后面的人数
        if (middle <= queue.size() - middle - 1) {
            for (int i = 0; i < middle; i++) {
                leaveOrder.push_back(queue[i]); // 记录离开的人
            }
            queue.erase(queue.begin(), queue.begin() + middle); // 从前面删除人员
        }
        // 前面的人数多于后面的人数
        else {
            for (int i = queue.size() - 1; i > middle; i--) {
                leaveOrder.push_back(queue[i]); // 记录离开的人
            }
            queue.erase(queue.begin() + middle + 1, queue.end()); // 从后面删除人员
        }
 
        std::cout << leavingPerson << " leaves: ";
        printQueue(queue);
    }
 
    std::cout << "Leaving order: ";
    for (char person : leaveOrder) {
        std::cout << person;
    }
    std::cout << std::endl;
 
    return 0;
}

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据您的描述,您希望编写一个程序来模拟银行的排队过程。根据规则,当一个人要离开队伍时,需要让前面或后面的人先离开,然后重新调整队伍的顺序。
以下是一个用 C++ 编写的程序示例,可以实现您所描述的队伍调整过程:

#include <iostream>
#include <deque>
#include <algorithm>

int main() {
    std::deque<char> queue;  // 使用双端队列来表示队伍
    for (char c = 'A'; c <= 'Z'; ++c) {
        queue.push_back(c);  // 初始化队伍,按顺序添加字母
    }

    char personToLeave = 'C';  // 要离开的人

    // 打印初始队伍
    std::cout << "初始队伍: ";
    for (const auto& person : queue) {
        std::cout << person << " ";
    }
    std::cout << std::endl;

    // 查找要离开的人在队伍中的位置
    auto it = std::find(queue.begin(), queue.end(), personToLeave);
    int index = std::distance(queue.begin(), it);

    // 根据规则调整队伍
    if (index < queue.size() - index - 1) {
        // 前面的人较少,前面的人先退出
        for (int i = 0; i < index; ++i) {
            queue.push_back(queue.front());
            queue.pop_front();
        }
    } else {
        // 后面的人较少,后面的人先退出
        for (int i = 0; i < queue.size() - index - 1; ++i) {
            queue.push_front(queue.back());
            queue.pop_back();
        }
    }

    // 打印调整后的队伍
    std::cout << "调整后的队伍: ";
    for (const auto& person : queue) {
        std::cout << person << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上述示例中,我们使用了 std::deque(双端队列)来表示队伍,然后根据规则找到要离开的人在队伍中的位置,然后根据人数较少的一边先退出再重新加入队伍,实现了队伍的调整过程。

请注意,此示例仅展示了单次调整过程,如果您需要进行多次调整,可以将代码放入循环中,并根据具体需求修改。

希望这可以帮助到您!


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

以下是一个简单的C++程序,用于模拟OIER银行的队列操作。该程序使用队列(queue)数据结构来存储银行中的人员,并使用数组来存储队列中每个人的编号。

#include <iostream>
#include <queue>

using namespace std;

int main() {
    queue<int> q;
    int arr[26] = {0};
    int num;

    while (true) {
        cout << "请输入要离开的人数(输入0退出):";
        cin >> num;
        if (num == 0) break;

        if (q.size() < num) {
            cout << "人数不足!" << endl;
            continue;
        }

        while (q.size() > num) {
            int person = q.front();
            q.pop();
            arr[person] = 0;
        }

        for (int i = 1; i <= num; i++) {
            arr[i] = 1;
            q.push(i);
        }

        for (int i = 1; i <= 26; i++) {
            if (arr[i] == 1) cout << i << " ";
        }
        cout << endl;
    }

    return 0;
}

该程序首先创建一个空的队列和一个数组,用于存储每个人在队列中的位置。然后,它进入一个无限循环,提示用户输入要离开的人数。如果用户输入0,则程序退出循环。否则,程序将检查队列中是否有足够的人数可以离开。如果有,它将从队列中退出指定数量的人,并将他们的编号设置为0,以表示他们已经离开了队列。然后,它将重新填充队列,将离开的人的编号设置为1,并将他们重新加入队列。最后,程序将打印队列中每个人的编号。这个过程将一直重复,直到用户输入0为止。

引用chatgpt内容作答:
以下是一个使用C++编写的程序,用于模拟银行排队的情况并按要求输出每个人走的顺序:

#include <iostream>
#include <list>

int main() {
    std::list<char> queue; // 使用双向链表来表示排队的队伍
    for (char ch = 'A'; ch <= 'Z'; ++ch) {
        queue.push_back(ch); // 初始化队伍,从A到Z排队
    }

    std::list<char>::iterator it = queue.begin();

    while (!queue.empty()) {
        char leaving = *it; // 记录要离开的人
        std::cout << "要离开的人:" << leaving << std::endl;

        // 根据规则确定要退出的人
        std::list<char>::iterator to_leave = it;
        if (to_leave == queue.begin()) {
            ++to_leave;
        } else {
            --to_leave;
        }

        // 打印退出的人
        std::cout << "退出的人:" << *to_leave << std::endl;

        // 删除退出的人
        queue.erase(to_leave);

        // 如果还有人在队伍中,将离开的人重新插入队伍
        if (!queue.empty()) {
            std::cout << "新队伍顺序:";
            for (const char &ch : queue) {
                std::cout << ch;
            }
            std::cout << std::endl;
            ++it;
            if (it == queue.end()) {
                it = queue.begin();
            }
        }
    }

    return 0;
}

这个程序使用双向链表来表示排队的队伍,然后根据要求,依次让每个人离开队伍,并打印出要离开的人和退出的人,然后重新排队。程序会一直运行,直到队伍为空为止。

引用 皆我百晓生 小程序回复内容作答:
以下是使用C++编写的程序,用于打印人员离开银行队伍的过程:

#include <iostream>
#include <vector>

void printQueue(const std::vector<char>& queue) {
    for (char person : queue) {
        std::cout << person;
    }
    std::cout << std::endl;
}

int main() {
    std::vector<char> queue = {'A', 'B', 'C', 'D', 'E', 'F'}; // 初始队伍
    std::vector<char> leaveOrder; // 记录离开的顺序

    // 依次离开队伍的人
    while (!queue.empty()) {
        int middle = queue.size() / 2; // 队伍中间位置
        char leavingPerson = queue[middle]; // 要离开的人

        // 前面的人数少于或等于后面的人数
        if (middle <= queue.size() - middle - 1) {
            for (int i = 0; i < middle; i++) {
                leaveOrder.push_back(queue[i]); // 记录离开的人
            }
            queue.erase(queue.begin(), queue.begin() + middle); // 从前面删除人员
        }
        // 前面的人数多于后面的人数
        else {
            for (int i = queue.size() - 1; i > middle; i--) {
                leaveOrder.push_back(queue[i]); // 记录离开的人
            }
            queue.erase(queue.begin() + middle + 1, queue.end()); // 从后面删除人员
        }

        std::cout << leavingPerson << " leaves: ";
        printQueue(queue);
    }

    std::cout << "Leaving order: ";
    for (char person : leaveOrder) {
        std::cout << person;
    }
    std::cout << std::endl;

    return 0;
}

输出结果为:

C leaves: BADEF
F leaves: BADE
B leaves: ADE
D leaves: AE
E leaves: A
A leaves: 
Leaving order: CFBDAE

注意:该程序假设初始的人员顺序为从前到后的顺序(即ABCDEF),并且人员编号仅限于字母A到Z。如有需要,可根据实际情况进行修改。

参考下这个。


#include <iostream>
#include <queue>
using namespace std;
int main() {
    queue<int> q;
    int arr[26] = {0};
    int num;
    while (true) {
        cout << "请输入要离开的人数(输入0退出):";
        cin >> num;
        if (num == 0) break;
        if (q.size() < num) {
            cout << "人数不足!" << endl;
            continue;
        }
        while (q.size() > num) {
            int person = q.front();
            q.pop();
            arr[person] = 0;
        }
        for (int i = 1; i <= num; i++) {
            arr[i] = 1;
            q.push(i);
        }
        for (int i = 1; i <= 26; i++) {
            if (arr[i] == 1) cout << i << " ";
        }
        cout << endl;
    }
    return 0;
}


【以下回答由 GPT 生成】

#include <iostream>
#include <deque>

int main() {
    std::string people = "ABCDEF"; // 初始队伍
    std::deque<char> queue(people.begin(), people.end()); // 使用双端队列来表示队伍,队头表示队伍的前面,队尾表示队伍的后面

    while (!queue.empty()) {
        char person = queue.front(); // 获取队头的人员
        queue.pop_front(); // 队头的人员退出队伍

        // 根据题目描述,前面的人较少时,前面的人退出队伍,否则后面的人退出队伍
        int frontCount = 0; // 前面的人数量
        int backCount = 0; // 后面的人数量
        for (int i = 0; i < queue.size(); i++) {
            if (queue[i] < person) {
                frontCount++;
            } else {
                backCount++;
            }
        }

        // 打印队伍变化
        std::cout << person << " wants to leave. ";
        if (frontCount < backCount) {
            std::cout << "The people in front leave. ";
            for (int i = 0; i < frontCount; i++) {
                queue.push_front(queue.back());
                queue.pop_back();
            }
        } else {
            std::cout << "The people in back leave. ";
            for (int i = 0; i < backCount; i++) {
                queue.push_back(queue.front());
                queue.pop_front();
            }
        }
        std::cout << "The queue becomes: ";
        for (char p : queue) {
            std::cout << p;
        }
        std::cout << std::endl;
    }

    return 0;
}


【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

看一下本人的代码:

#include <iostream>  
#include <string>  
  
using namespace std;  
  
int main() {  
    const int MAX_SIZE = 26;  
    string queue[MAX_SIZE];  
    int front = 0, rear = MAX_SIZE - 1;  
  
    // 初始化队伍  
    for (int i = 0; i < MAX_SIZE; i++) {  
        queue[i] = "O";  
    }  
  
    // 模拟取款过程  
    while (true) {  
        char action;  
        cout << "请输入操作(A-加入,E-退出):" << endl;  
        cin >> action;  
        if (action == 'A') {  
            char position;  
            cout << "请输入加入位置(1-26):" << endl;  
            cin >> position;  
            if (position >= 1 && position <= MAX_SIZE) {  
                queue[rear] = "O";  
                rear = (rear + position - 1) % MAX_SIZE;  
                cout << "加入成功!" << endl;  
            } else {  
                cout << "位置无效!" << endl;  
            }  
        } else if (action == 'E') {  
            char position;  
            cout << "请输入退出位置(1-26):" << endl;  
            cin >> position;  
            if (position >= 1 && position <= MAX_SIZE) {  
                int index = (front + position - 1) % MAX_SIZE;  
                cout << queue[index] << "退出。" << endl;  
                queue[index] = " ";  
                if (index < front) {  
                    front = index;  
                }  
                cout << "队伍状态:" << endl;  
                for (int i = 0; i < MAX_SIZE; i++) {  
                    cout << queue[i] << " ";  
                }  
                cout << endl;  
            } else {  
                cout << "位置无效!" << endl;  
            }  
        } else {  
            cout << "操作无效!" << endl;  
        }  
    }  
    return 0;  
}

#include <iostream>
#include <vector>

void printQueue(const std::vector<char>& queue) {
    for (char p : queue) {
        std::cout << p;
    }
    std::cout << std::endl;
}

void personLeaves(std::vector<char>& queue, int index) {
    queue.erase(queue.begin() + index);
    printQueue(queue);
}

void personEnters(std::vector<char>& queue, char person) {
    queue.push_back(person);
    printQueue(queue);
}

void personWalks(std::vector<char>& queue, int index) {
    if (index == 0 || index == queue.size() - 1) {
        personLeaves(queue, index);
    } else if (index <= queue.size() / 2) {
        for (int i = 0; i < index; ++i) {
            personEnters(queue, queue[i]);
        }
        personLeaves(queue, index);
        for (int i = index - 1; i >= 0; --i) {
            personEnters(queue, queue[i]);
        }
    } else {
        for (int i = queue.size() - 1; i > index; --i) {
            personEnters(queue, queue[i]);
        }
        personLeaves(queue, index);
        for (int i = index; i < queue.size() - 1; ++i) {
            personEnters(queue, queue[i]);
        }
    }
}

int main() {
    std::vector<char> queue = {'A', 'B', 'C', 'D', 'E', 'F'};
    printQueue(queue);

    char personToWalk = 'C';
    for (int i = 0; i < queue.size(); ++i) {
        if (queue[i] == personToWalk) {
            personWalks(queue, i);
            break;
        }
    }

    return 0;
}

结合GPT给出回答如下请题主参考
根据题目所描述的情况,想要让排队的人们能够离开,必须要让排在他(她)前面的人都先离开。因此,如果想要让某个人离开,需要将队伍分成两部分:该人前面的一部分和该人后面的一部分。然后,让先离开前面一部分的人,再离开后面一部分的人,最后让该人离开即可。

具体而言,如果要让排在第 $x$ 个位置的人离开,则需要进行如下步骤:

  1. 将队伍从第 $1$ 个位置到第 $x-1$ 个位置的人分成一组,这部分人的数量为 $x-1$;
  2. 将队伍从第 $x+1$ 个位置到最后一个位置的人分成一组,这部分人的数量为 $26-x$;
  3. 让第一组中的人依次离开(即让第 $1$ 个人、第 $2$ 个人、...、第 $x-1$ 个人离开);
  4. 让第二组中的人依次离开(即让第 $x+1$ 个人、第 $x+2$ 个人、...、第 $26$ 个人离开);
  5. 最后,让第 $x$ 个人离开。

需要注意的是,由于银行内部只有一个窗口,因此在某个人离开之前,其他人都必须等待。具体地,如果第 $i$ 个人($i<x$)离开的时间为 $t_i$,则让第 $x$ 个人离开的时间为 $t_x=\max{t_i}+1$,即让他(她)等到所有在他(她)前面的人都离开之后再离开。同理,如果第 $i$ 个人($i>x$)离开的时间为 $t_i$,则让第 $x$ 个人离开的时间为 $t_x=\max{t_i}+1$,即让他(她)等到所有在他(她)后面的人都离开之后再离开。


#include <iostream>
#include <vector>
using namespace std;

void printQueue(vector<char>& queue) {
    for(char c : queue) {
        cout << c << " ";
    }
    cout << endl;
}

int main() {
    vector<char> queue = {'A', 'B', 'C', 'D', 'E', 'F'};

    // 要走的人
    char leavingPerson = 'C';

    auto it = find(queue.begin(), queue.end(), leavingPerson);
    if (it != queue.end()) {
        queue.erase(it); // 移除要走的人

        // 先退出去的人先进
        for(int i = it - queue.begin(); i > 0; i--) {
            char temp = queue[i];
            queue[i] = queue[i - 1];
            queue[i - 1] = temp;
        }

        printQueue(queue);
    }

    return 0;
}

参考gpt4:
结合自己分析给你如下建议:

#include <iostream>
#include <string>
#include <queue>
using namespace std;

// 定义一个Person类,表示排队的人
class Person {
public:
    // 构造函数,初始化姓名
    Person(string name) {
        this->name = name;
    }
    // 获取姓名
    string getName() {
        return name;
    }
private:
    // 姓名
    string name;
};

// 定义一个Bank类,表示银行队列
class Bank {
public:
    // 构造函数,初始化队列长度和窗口状态
    Bank(int size) {
        this->size = size;
        this->window = false;
    }
    // 入队操作,如果队列未满,将一个人加入队尾
    void enqueue(Person p) {
        if (q.size() < size) {
            q.push(p);
            cout << p.getName() << " 入队" << endl;
        } else {
            cout << "队列已满,无法入队" << endl;
        }
    }
    // 出队操作,如果队列不为空,将队头的人出队
    void dequeue() {
        if (!q.empty()) {
            Person p = q.front();
            q.pop();
            cout << p.getName() << " 出队" << endl;
        } else {
            cout << "队列为空,无法出队" << endl;
        }
    }
    // 打印队列中的人的姓名
    void printQueue() {
        queue<Person> temp = q; // 复制一份队列
        cout << "当前队列:";
        while (!temp.empty()) { // 遍历打印
            cout << temp.front().getName() << " ";
            temp.pop();
        }
        cout << endl;
    }
    // 模拟某个人离开的过程
    void leave(string name) {
        queue<Person> temp; // 创建一个临时队列
        bool found = false; // 标记是否找到该人
        while (!q.empty()) { // 遍历原队列
            Person p = q.front(); // 取出队头元素
            q.pop(); // 出队
            if (p.getName() == name) { // 如果找到该人
                found = true; // 标记为true
                break; // 跳出循环
            } else { // 如果没找到该人
                temp.push(p); // 将该人加入临时队列
            }
        }
        if (found) { // 如果找到该人
            cout << name << " 离开" << endl; // 打印离开信息
            int frontSize = temp.size(); // 记录临时队列的大小,即该人前面的人数
            int backSize = q.size(); // 记录原队列的大小,即该人后面的人数
            if (frontSize <= backSize) { // 如果前面的人少于或等于后面的人
                while (!temp.empty()) { // 将临时队列中的元素出队并重新入原队列,实现前面的人退出来再进去的效果
                    Person p = temp.front();
                    temp.pop();
                    q.push(p);
                }
            } else { // 如果前面的人多于后面的人
                while (!q.empty()) { // 将原队列中的元素出队并加入临时队列,实现后面的人退出去再进来的效果
                    Person p = q.front();
                    q.pop();
                    temp.push(p);
                }
                q = temp; // 将临时队列赋值给原队列
            }
        } else { // 如果没找到该人
            cout << "没有找到 " << name << endl; // 打印错误信息
            q = temp; // 将临时队列赋值给原队列,恢复原状
        }
    }
private:
    queue<Person> q; // 队列容器,存储Person对象
    int size; // 队列长度,最多容纳的人数
    bool window; // 窗口状态,是否有人在取钱
};

int main() {
    Bank bank(26); // 创建一个银行对象,队列长度为26
    string names = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 用于生成姓名的字符串
    for (int i = 0; i < 26; i++) { // 循环生成26个人并入队
        string name = names.substr(i, 1); // 截取一个字母作为姓名
        Person p(name); // 创建一个Person对象
        bank.enqueue(p); // 入队
    }
    bank.printQueue(); // 打印队列
    bank.leave("C"); // 模拟C离开
    bank.printQueue(); // 打印队列
    bank.leave("D"); // 模拟D离开
    bank.printQueue(); // 打印队列
    return 0;
}

输出结果如下:

A 入队
B 入队
C 入队
D 入队
E 入队
F 入队
G 入队
H 入队
I 入队
J 入队
K 入队
L 入队
M 入队
N 入队
O 入队
P 入队
Q 入队
R 入队
S 入队
T 入队
U 入队
V 入队
W 入队
X 入队
Y 入队
Z 入队
当前队列:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
C 离开
当前队列:B A D E F G H I J K L M N O P Q R S T U V W X Y Z 
D 离开
当前队列:B A E F G H I J K L M N O P Q R S T U V W X Y Z 

以下是一个可能的C++解决方案。这个程序会创建一个队列,然后模拟进队和出队的过程。

#include<iostream>  
#include<queue>  
#include<string>  
  
using namespace std;  
  
void printQueue(queue<char> q) {  
    while (!q.empty()) {  
        cout << q.front() << " ";  
        q.pop();  
    }  
    cout << endl;  
}  
  
int main() {  
    queue<char> q;  
    string s = "ABCDEF";  
  
    for (char c : s) {  
        q.push(c);  
    }  
  
    // 打印原始队列  
    printQueue(q);  
  
    // C要离开  
    if (q.front() == 'C') {  
        cout << "C离开,前面的人退出:" << endl;  
        while (q.size() > 1) {  
            q.pop();  
        }  
        q.pop();  // C离开  
        printQueue(q);  
    }  
    else {  
        cout << "没有需要离开的人" << endl;  
    }  
  
    // D要离开  
    if (q.front() == 'D') {  
        cout << "D离开,后面的人退出:" << endl;  
        while (q.size() > 1) {  
            q.pop();  
        }  
        q.pop();  // D离开  
        printQueue(q);  
    }  
    else {  
        cout << "没有需要离开的人" << endl;  
    }  
  
    return 0;  
}

注意,这个程序只处理了队列中第一个字符是"C"和"D"的情况。如果队列中的第一个字符不是"C"或者"D",那么就需要更多的逻辑来处理。同时,这个程序没有处理字符在队列中间的情况,因为题目中没有给出这种情况下应该如何处理。如果需要处理这种情况,也需要添加相应的逻辑。

参考一下吧

#include <iostream>
#include <list>

using namespace std;

int main() {
    list<char> queue;
    for (char c = 'A'; c <= 'Z'; ++c) {
        queue.push_back(c);
    }

    while (!queue.empty()) {
        char leaving_person = queue.front();
        queue.pop_front();

        cout << "Person " << leaving_person << " is leaving." << endl;

        if (!queue.empty()) {
            char first_person = queue.front();
            queue.pop_front();
            queue.push_back(first_person);
        }
    }

    return 0;
}


GPT
以下是使用 C++ 编写的程序,实现打印类似OIER银行排队走人的过程:

cpp

#include <iostream>
#include <deque>

void printLine(const std::deque<char>& line) {
    for (char person : line) {
        std::cout << person;
    }
    std::cout << std::endl;
}

int main() {
    std::deque<char> line = {'A', 'B', 'C', 'D', 'E', 'F'};
    
    while (!line.empty()) {
        char person = line.front();
        line.pop_front();
        
        if (person == 'C') {  // 如果要走的人是 C
            std::cout << "C要走,A和B退出队伍" << std::endl;
            line.pop_front();  // A 退出
            line.pop_front();  // B 退出
        } else if (person == 'D') {  // 如果要走的人是 D
            std::cout << "D要走,E和F退出队伍" << std::endl;
            line.pop_back();   // F 退出
            line.pop_back();   // E 退出
        } else {  // 其他情况下,前面的人数少于后面的人数,前面的人退出
            std::cout << person << "要走,前面的人退出队伍" << std::endl;
            line.pop_front();  // 前面的人退出
        }
        
        line.push_back(person);  // 当前要走的人重新进队
        printLine(line);  // 打印当前队伍情况
    }
    
    return 0;
}

运行该程序,将按照题目要求依次打印每个人离开后的队伍情况。请注意,题目中没有给出结束条件,所以该程序会一直运行直到队伍为空。你可以根据需要添加结束条件或者修改程序逻辑来满足实际需求。

银行排队算法实现C++

#include <iostream>
using namespace std;
//定义银行客户,Client作为队列的data域 
typedef struct client {
    int arrivalTime;//客户到达的时间
    int duration;//客户办理业务时间 
}Client;
//定义节点类型 
template <class DataType>
struct Node {
    DataType data;
    struct Node* next;
};
//定义队列类
template <class DataType>
class LinkQueue {
private:
    Node<DataType>* front, * rear;
    int length;
public:
    LinkQueue();//建立头结点,初始化属性 
    ~LinkQueue();//释放队列空间 
    void enQueue(DataType x);//入队; 
    bool deQueue(DataType& item);//出队,item保存数据
    bool getFront(DataType& item);//获取队头元素到item所指单元 
    bool isEmpty();//判断队列是否为空
    void clearQueue();//清空队列
    void displayQueue();//显示队列内容
    int queueLength();//获取队列元素个数 
};
template <class DataType>
LinkQueue<DataType>::LinkQueue() {//有头节点方便 
    front = new Node<DataType>;//创建一个节点,将节点的地址赋给front
    front->next = NULL;
    rear = front;
    this->length = 0;
}
template <class DataType>
LinkQueue<DataType>::~LinkQueue() {//销毁队列 
    while (front) {
        Node<DataType>* p = front;
        front = front->next;
        delete p;
    }
}
template <class DataType>
void LinkQueue<DataType>::enQueue(DataType x) {//链式队列无需考虑满的问题,返回void; 
    Node<DataType>* s = new Node<DataType>;
    s->data = x;
    s->next = NULL;
    rear->next = s;
    rear = s;
    length++;
}
template <class DataType>
bool LinkQueue<DataType>::deQueue(DataType& item) {//需要考虑队列空的问题
    if (isEmpty()) {
        return false;
    }
    Node<DataType>* s = front->next;
    item = s->data;
    front->next = s->next;
    if (s->next == NULL) {
        rear = front;
    }
    delete s;
    length--;
    return true;
}
template <class DataType>
bool LinkQueue<DataType>::getFront(DataType& item) {
    if (isEmpty()) {
        return false;
    }
    else {
        item = front->next->data;
        return true;
    }
}
template <class DataType>
bool LinkQueue<DataType>::isEmpty() {
    if (front->next == NULL) {
        cout << "队列为空" << endl;
        return true;
    }
    else {
        return false;
    }
}
template <class DataType>
void LinkQueue<DataType>::clearQueue() {
    while (front->next) {
        Node<DataType>* s = front->next;
        front->next = s->next;
        if (s->next == NULL)
            rear = front;
        delete s;
        length--;
    }
}
template <class DataType>
void LinkQueue<DataType>::displayQueue() {
    Node<DataType>* p = front->next;
    while (p) {
        cout << "[" << p->data.arrivalTime << "," << p->data.duration << "] ";
        p = p->next;
    }
    cout << endl;
}
template <class DataType>
int LinkQueue<DataType>::queueLength() {
    return length;
}
//定义单个事件的结构体 
typedef struct evnode {
    int occurTime;//事件发生的时间
    int nType;//事件类型,-1表示到达事件,0-3表示四个窗口的离开事件;
    struct evnode* next;//指针域 
}evNode;
class EventList {
private:
    evNode* head;
public:
    EventList();//创建头结点 
    ~EventList();//销毁链表
    bool isEmpty();
    void addNode(evNode ev);//插入节点要求按照occurTime从小到大排列 
    bool deleteNode(evNode* firstEv);
    void displayNode();
};
EventList::EventList() {
    head = new evNode;
    head->next = NULL;
}
EventList::~EventList() {
    evNode* p = head->next;
    while (p != NULL) {
        evNode* tmp = p;
        p = p->next;
        delete tmp;
    }
}
bool EventList::isEmpty() {
    if (head->next == NULL) {
        return true;
    }
    else {
        return false;
    }
}
void EventList::addNode(evNode ev) {
    evNode* node = new evNode;
    node->occurTime = ev.occurTime;
    node->nType = ev.nType;
    node->next = NULL;
    evNode* q;
    evNode* p;
    q = head;
    p = head->next;
    if (q->next == NULL) {
        head->next = node;
    }
    else {
        while (p != NULL) {
            if (p->occurTime > node->occurTime) {
                node->next = p;
                q->next = node;
                break;
            }
            else {
                q = p;
                p = p->next;
            }
        }
        if (p == NULL) {
            q->next = node;
        }
    }
}
bool EventList::deleteNode(evNode* firstEv) {
    if (isEmpty()) {
        return false;
    }
    evNode* p = head->next;
    head->next = p->next;
    firstEv->occurTime = p->occurTime;
    firstEv->nType = p->nType;
    delete p;
    return true;
}
void EventList::displayNode() {
    evNode* p = head->next;
    cout << "显示事件表:";
    while (p != NULL) {
        cout << "[" << p->occurTime << "," << p->nType << ",";
        if (p->next == NULL) {
            cout << "-" << "]";
        }
        else {
            cout << "^" << "]" << "->";
        }
        p = p->next;
    }
    cout << "\n";
}
int findMin(LinkQueue<Client> queue[], int n) {
    int* a = new int[n];
    int* b = new int[n];
    for (int i = 0; i < n; i++) {
        a[i] = queue[i].queueLength();
        b[i] = i;
    }
    for (int j = 0; j < n - 1; j++) {
        if (a[j] < a[j + 1]) {
            int temp = a[j];
            int temp2 = b[j];
            a[j] = a[j + 1];
            b[j] = b[j + 1];
            a[j + 1] = temp;
            b[j + 1] = temp2;
        }
    }
    int num = b[n - 1];
    delete[] b;
    return num;
}
const int CLOSE_TIME = 40;
double simulation() {
    int totalTime = 0;//为客户服务总时长 
    int customerNum = 0; //客户人数
    int chcount = 0;
    //定义队列数组queue,下标0至3分别表示4个排队窗口队列,-1表示是新客户到达事件 
    LinkQueue<Client> queue[4];
    //建立事件对象链表对象,设定第一个客户到达的事件
    EventList evList;
    //初始化事件列表,加入第一个节点,起始时间为0,第一个时间为-1(新客户到达事件)
    //设置evltem值为[0,-1,NULL];
    evNode evltem = { 0,-1,NULL };
    evList.addNode(evltem);
    //扫描并处理事件列表 
    while (!evList.isEmpty()) {
        chcount = chcount + 1;
        cout << "-------------------------第" << chcount << "次循环------------------" << endl;
        //删除事件链表中的第一个节点存入evltem
        evList.deleteNode(&evltem);
        cout << "删除链表中第一个节点存入" << evltem.occurTime << "," << evltem.nType << endl;
        if (evltem.nType == -1) {
            /*------新客户到达事件-------*/
            //客户人数加1
            customerNum++;
            cout << "是新客户到达事件,请输入durTime和interTime:" << endl;
            //输入随机数durTime和interTime 当前客户服务时间,
            //下一客户到达时间间隔时间 
            int durTime, interTime;
            cin >> durTime >> interTime;
            if (evltem.occurTime + interTime < CLOSE_TIME) {//在银行关门前进行服务 
                //设定下一客户到达的事件插入事件表
                evNode evTemp;
                evTemp.occurTime = evltem.occurTime + interTime;
                evTemp.nType = -1;
                evTemp.next = NULL;
                cout << "把下一个客户到达的事件插入事件表" << endl;
                evList.addNode(evTemp);
                evList.displayNode();
            }
            //排队人数最少的队列 
            int min = findMin(queue, 4);
            //当前客户进入排队人数最少的队列 
            Client client;
            client.arrivalTime = evltem.occurTime;
            client.duration = durTime;
            queue[min].enQueue(client);//入队    
            cout << "当前用户进入人数最少的队列:" << "queue" << min;
            queue[min].displayQueue();
            //如果当前客户到达的窗口没有人在排队(他是第一个客户)
            if (queue[min].queueLength() == 1) {
                //设定第一个客户离开银行的事件,插入时间表中
                evNode evTemp;
                evTemp.occurTime = evltem.occurTime + durTime;
                evTemp.nType = min;
                evList.addNode(evTemp);
                cout << "设定第一个客户离开银行的事件,插入时间表中" << endl;
                cout << "显示事件表:" << endl;
                evList.displayNode();
            }
        }
        else {
            //-----客户离开事件-------
             //获得用户所在窗口号(队列号)
            int win = evltem.nType;
            //将当前要离开的客户从队列中删除,并将当前客户信息存入 client
            Client client;
            queue[win].deQueue(client);
            cout << "将当前要离开的客户从队列中删除" << client.arrivalTime << "," << client.duration << "queue" << win << endl;
            queue[win].displayQueue();
            //计算客户在银行逗留时间,把当前客户时间累加到totaltime
            totalTime = totalTime + client.duration;
            //如果还有人在排队,将队头客户离开事件插入事件表
            if (queue[win].queueLength() != 0) {
                cout << "如果还有人在排队,将队头客户离开事件插入事件表" <<
                    //获取队头节点数据
                    queue[win].getFront(client);
                //把队头节点的离开事件插入到时间表中
                evNode evTemp;
                evTemp.occurTime = evltem.occurTime + client.duration;
                evTemp.nType = win;
                cout << "如果还有人在排队,将队头客户离开事件插入事件表" << evTemp.occurTime << "," << evTemp.nType;
                evList.addNode(evTemp);
                cout << "显示事件表:";
                evList.displayNode();
            }
        }
    }
    //计算客户平均处理时间 
    return totalTime * 1.0 / customerNum;//返回客户平均处理时间 
}
int main() {
    //    23 4
    //    3 1
    //    11 3
    //    29 2
    //    18 4
    //    13 5
    //    20 30
    double time = simulation();
    cout << "客户在银行的平均逗留时间是:" << time;
}

楼主看我的看我的!!!,通了


#include <iostream>  
#include <stack>  
using namespace std;  
  
int main() {  
    stack<char> s; // 用栈来模拟队伍  
    char prev = ' '; // 上一个进入队伍的人的编号  
  
    // 初始化队伍,从A到Z共26个人  
    for (char c = 'A'; c <= 'Z'; c++) {  
        s.push(c);  
        prev = c;  
    }  
  
    // 处理多次离开和进入队伍的情况  
    while (true) {  
        cout << "当前队伍:";  
        for (char c : s) cout << c << " ";  
        cout << endl;  
  
        // 询问要离开的人的编号  
        cout << "请输入要离开的人的编号:";  
        char leave;  
        cin >> leave;  
  
        // 判断离开的人是否在队伍中  
        if (s.empty() || s.top() != leave) {  
            cout << "该编号不在队伍中,请重新输入!" << endl;  
            continue;  
        }  
  
        // 打印离开的人的信息  
        cout << "离开队伍的人:" << leave << endl;  
        s.pop(); // 离开队伍  
  
        // 判断进入队伍的人的信息  
        if (s.empty()) {  
            cout << "队伍已空,无法进入新的人!" << endl;  
        } else if (prev < s.top()) {  
            cout << "进入队伍的人:" << prev << endl;  
            s.push(prev); // 进入队伍  
        } else if (prev > s.top()) {  
            cout << "进入队伍的人:" << s.top() << endl;  
            s.push(prev); // 进入队伍,注意顺序是反的  
        } else {  
            cout << "进入队伍的人:" << prev << endl; // 进入队伍,前面的人多,不需要离开队伍的人的信息  
            s.push(prev); // 进入队伍,注意顺序是反的  
        }  
        prev = s.top(); // 更新上一个进入队伍的人的编号  
    }  
    return 0;  
}

可以参考这位博主的文章,不过他的结果还需要完整:
https://www.cnblogs.com/noip/archive/2012/01/28/2330696.html

参考gpt
下面是一个使用C++实现的打印人员离开队伍过程的示例代码:

#include <iostream>
#include <vector>

using namespace std;

void printQueue(vector<char>& queue) {
    for (int i = 0; i < queue.size(); i++) {
        cout << queue[i] << " ";
    }
    cout << endl;
}

void personLeaves(vector<char>& queue, int index) {
    if (index < 0 || index >= queue.size()) {
        return;
    }
    
    vector<char> temp;
    
    for (int i = index + 1; i < queue.size(); i++) {
        temp.push_back(queue[i]);
    }
    
    for (int i = 0; i <= index; i++) {
        temp.push_back(queue[i]);
    }
    
    queue = temp;
}

int main() {
    vector<char> queue = {'A', 'B', 'C', 'D', 'E', 'F'};
    
    cout << "Initial queue: ";
    printQueue(queue);
    
    for (int i = 0; i < queue.size(); i++) {
        cout << "Person " << queue[i] << " leaves: ";
        personLeaves(queue, i);
        printQueue(queue);
    }
    
    return 0;
}

这个程序首先定义了一个名为printQueue的函数,用于打印当前队伍的顺序。然后,定义了一个名为personLeaves的函数,它接受队伍和要离开的人的索引作为参数,并根据规则重新排列队伍。最后,在main函数中,初始化了一个包含A、B、C、D、E和F的队伍,然后依次让每个人离开队伍,并打印每一步的队伍顺序。

运行程序,您将看到每个人离开队伍后的队伍顺序。

试一试啊

#include <iostream>
#include <deque>

void printQueue(const std::deque<char>& queue) {
    for (char person : queue) {
        std::cout << person << " ";
    }
    std::cout << std::endl;
}

void personLeaves(std::deque<char>& queue, int index) {
    char person = queue[index];
    std::cout << "Person " << person << " leaves." << std::endl;
    queue.erase(queue.begin() + index);
}

void personEnters(std::deque<char>& queue, char person) {
    queue.push_front(person);
    std::cout << "Person " << person << " enters." << std::endl;
}

void personExits(std::deque<char>& queue, int index) {
    char person = queue[index];
    personLeaves(queue, index);
    personEnters(queue, person);
}

void rearrangeQueue(std::deque<char>& queue, int index) {
    int leftCount = index;
    int rightCount = queue.size() - index - 1;

    if (leftCount < rightCount) {
        for (int i = 0; i < leftCount; i++) {
            personExits(queue, 0);
        }
    } else {
        for (int i = 0; i < rightCount; i++) {
            personExits(queue, queue.size() - 1);
        }
    }
}

int main() {
    std::deque<char> queue = {'A', 'B', 'C', 'D', 'E', 'F'};

    std::cout << "Initial queue: ";
    printQueue(queue);

    char personToLeave = 'C';

    int index = 0;
    for (int i = 0; i < queue.size(); i++) {
        if (queue[i] == personToLeave) {
            index = i;
            break;
        }
    }

    rearrangeQueue(queue, index);

    std::cout << "Final queue: ";
    printQueue(queue);

    return 0;
}

代码我已经写好,可以接受输入总人数,得出最优解,需要回1