UVa133 - The Dole Queue

제목: 각각 1과 N에서 k, m를 세고 선택한 수를 삭제한 다음, 그룹 길이가 0이 될 때까지 계속합니다.
사고방식: 주로 stl 중의list를 사용합니다
코드는 다음과 같습니다.
#include 
#include 
#include 
#include 

using namespace std;

void solve(int n, int k, int m);

int main()
{
#ifndef ONLINE_JUDGE
	ifstream fin("F:\\OJ\\uva_in.txt");
	streambuf *old = cin.rdbuf(fin.rdbuf());
#endif

	int n, k, m;

	while (cin >> n >> k >> m)
	{
		if (n == 0 && k == 0 && m == 0) break;

		solve(n, k, m);
	}

#ifndef ONLINE_JUDGE
	cin.rdbuf(old);
#endif

	return 0;
}

void solve(int n, int k, int m)
{
	list l;
	for (int i = 1; i <= n; i++)
	{
		l.push_back(i);
	}

	list::iterator kit = l.begin(), mit = --l.end();

	while (l.size() != 0)
	{
		for (int i = 1; i < k; i++)
		{
			kit++;
			if (kit == l.end()) kit = l.begin();
		}

		for (int i = 1; i < m; i++)
		{
			mit--;
			if (mit == l.end()) mit = --l.end();
		}

		if (*kit == *mit)
		{
			cout << setw(3) << right << *kit;
			kit = l.erase(kit);
			if (kit == l.end()) kit = l.begin();

			mit = kit;
			mit--;
			if (mit == l.end()) mit = --l.end();

			if (l.size() != 0) cout << ",";
		}
		else
		{
			cout << setw(3) << right << *kit << setw(3) << right << *mit;
			list::iterator it = kit;
			it++; if (it == l.end()) it = l.begin();
			if (it == mit)
			{
				mit = l.erase(mit);
				if (mit == l.end()) mit = --l.end();

				kit = l.erase(kit);
				if (kit == l.end()) kit = l.begin();

				mit--;
				if (mit == l.end()) mit = --l.end();

			}
			else
			{
				kit = l.erase(kit);
				if (kit == l.end()) kit = l.begin();

				mit = l.erase(mit);
				if (mit == l.end()) mit = --l.end();
				else
                {
                    mit--;
                    if (mit == l.end()) mit = --l.end();
                }

			}

			if (l.size() != 0) cout << ",";
		}
	}
	cout << endl;
}

좋은 웹페이지 즐겨찾기