HOJ 1276 士兵队列训练问题(stl, 水题)

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
*/

猜你喜欢

转载自blog.csdn.net/qq_38232157/article/details/108368679