这道题使用链表完成 因为频繁涉及元素的删除,一些新学的知识包括:
迭代器定义 List<int>::iterator it;
erase(it)会自动返回下一个迭代器对象
*it可以获得迭代器的值 it->first it->second 可以获取map键值对
auto 自动确定类型
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/*
*/
int main()
{
int N;
cin >> N;
while (N--) {
int n;
cin >> n;
list<int> l;
//list<int>::iterator it;
for (int i = 1; i <= n; ++i) l.push_back(i);//初始化编号
int k = 2;//喊号间隔
while (l.size() > 3)
{
int count = 1;//计算当前是第几个人
for (auto it = l.begin(); it != l.end();)
{
if ((count++) % k == 0) it = l.erase(it);
else it++;
}
k = (k == 2) ? 3 : 2;
}
for (auto it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
return 0;
}