Charlie_Parker 2023-08-22 19:03 采纳率: 40%
浏览 8
已结题

#c++#:沃瑟夫问题,指导指导

沃瑟夫问题:约瑟夫问题的变体

img

#include <bits/stdc++.h>
using namespace std;

const int size = 5001;

int n, front = 1, rear = size;
int q[size + 1];

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        rear = rear % size + 1;
        q[rear] = i;
    }
    int x = 0, i = 1;
    while (rear % size + 1 != front) {
        int y = q[front];
        front = front % size + 1;
        x++;
        if (x == i * i) {
            printf("%d ", y);
            x = 0;
            i++;
        } else {
            rear = rear % size + 1;
            q[rear] = y;
        }
    }
    return 0;
}

因为n 最大是5000,一个for,一个while会超时间复杂度(1s)
希望帮助改良代码

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-22 21:29
    关注

    【以下回答由 GPT 生成】

    这段代码中有两个循环会导致超时问题,一个是for循环,一个是while循环。下面是对代码的改进建议:

    1. 使用std::queue代替数组:当前代码使用数组来模拟队列,但是使用动态数组会导致较慢的性能。C++标准库中的std::queue提供了队列数据结构,并且封装了实现细节,可以提供更高效的队列操作。因此,建议使用std::queue代替数组实现队列。

    2. 避免使用std::endl:当前代码在输出时使用了printf配合std::endl来刷新输出缓冲区。然而,std::endl会在遇到换行符时强制刷新输出缓冲区,在循环中频繁使用会导致性能下降。替代方案是使用换行符"\n"来换行,然后使用std::flush手动刷新输出缓冲区。

    下面是根据上述建议改进后的代码:

    #include <iostream>
    #include <queue>
    #include <cmath>
    
    int main() {
        int n;
        std::cin >> n;
    
        std::queue<int> q;
        for (int i = 1; i <= n; i++) {
            q.push(i);
        }
    
        int x = 0, i = 1;
        while (!q.empty()) {
            int y = q.front();
            q.pop();
            x++;
            if (x == i * i) {
                std::cout << y << " ";
                x = 0;
                i++;
            } else {
                q.push(y);
            }
        }
    
        std::cout << std::flush;
    
        return 0;
    }
    

    以上是改进后的代码,通过使用std::queue来代替数组实现队列,并在输出时使用换行符"\n"来换行,然后使用std::flush手动刷新输出缓冲区,可以有效提高代码的性能。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月31日
  • 已采纳回答 8月23日
  • 创建了问题 8月22日

悬赏问题

  • ¥20 c语言写的8051单片机存储器mt29的模块程序
  • ¥60 求直线方程 使平面上n个点在直线同侧并且距离总和最小
  • ¥50 java算法,给定试题的难度数量(简单,普通,困难),和试题类型数量(单选,多选,判断),以及题库中各种类型的题有多少道,求能否随机抽题。
  • ¥50 rk3588板端推理
  • ¥250 opencv怎么去掉 数字0中间的斜杠。
  • ¥15 这种情况的伯德图和奈奎斯特曲线怎么分析?
  • ¥250 paddleocr带斜线的0很容易识别成9
  • ¥15 电子档案元素采集(tiff及PDF扫描图片)
  • ¥15 flink-sql-connector-rabbitmq使用
  • ¥15 zynq7015,PCIE读写延时偏大