本题需要我们依次给出报数到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;
}