欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 信息奥赛一本通 2037:【例5.4】约瑟夫问题

信息奥赛一本通 2037:【例5.4】约瑟夫问题

2025/2/23 10:06:45 来源:https://blog.csdn.net/2401_88475903/article/details/145065547  浏览:    关键词:信息奥赛一本通 2037:【例5.4】约瑟夫问题

本题需要我们依次给出报数到m的人,因为每一次都要对整个队伍重新遍历,所以我们需要使用循环,而且每次遍历到符合条件的人,这个人就要出列,所以我们可以使用vector中的erase函数进行解决。那么我们如何知道每次是哪一个人,需要出列呢?我们想,如果需要从当前位置,报数m次,那么就需要从当前位置,走m-1步(因为当前位置也算一次报数),例如 当前位置为index,队伍长度为len,那么我们每次符合条件的人的位置为(index+m-1),又因为遍历的顺序类似于环形,所以我们需要对队伍的长度取模,防止超出队伍的长度。这样,将所有符合条件的人,依次放入目标数组,再输出即可

#include <iostream>
#include <cmath>
#include <iomanip>
#include <algorithm>
#include <vector>
using namespace std;vector<int> peo;
vector<int> result;
int main() {int n, m; cin >> n >> m;for (int i = 1; i <= n;i++) {peo.push_back(i);}int index = 0;while (!peo.empty()) {index = (index + m - 1) % peo.size();//报数到m,需要从当前位置再走m-1步result.push_back(peo[index]);peo.erase(peo.begin()+index);}for (int i : result) {cout << i << " ";}return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词