stl, 水题
本题要点:
1、用 list 模拟即可。
2、题目可能的歧义的地方:
有两种选法,
选法1:每2个出列一个,
选法2:每3个出列一个。
结束条件,每完成一种选法后,如果剩下的数 <= 3, 则结束。
可能歧义的理解: 执行某种选法,执行过程中(还没结束), 当前的数的数量 <= 3, 此时就结束了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
using namespace std;
const int MaxN = 5010;
int T, n;
void handle(list<int> &li)
{
list<int>::iterator it = li.begin();
int cnt = 0;
while(li.size() > 3)
{
cnt = 0;
it = li.begin();
while(it != li.end())
{
++cnt;
if(cnt % 2 == 0)
{
it = li.erase(it);
}else
++it;
}
if(li.size() <= 3)
return;
cnt = 0;
it = li.begin();
while(it != li.end())
{
++cnt;
if(cnt % 3 == 0)
it = li.erase(it);
else
++it;
}
}
}
void solve()
{
list<int> li;
for(int i = 1; i <= n; ++i)
li.push_back(i);
handle(li);
list<int>::iterator it = li.begin();
printf("%d", *it); ++it;
while(it != li.end())
{
printf(" %d", *it);
++it;
}
printf("\n");
}
int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
solve();
}
return 0;
}
/*
2
20
40
*/
/*
1 7 19
1 19 37
*/