1. 程式人生 > >POJ 1363 解題報告

POJ 1363 解題報告

這道題不難但是題目很難理解。看了測試樣例才明白,如果入棧順序是遞增的:1,2,3,4,5. 那麼給出一個出棧順序,比如5,4,1,2,3,判斷這個出棧順序是否可能。

我這裡就是按照題意模擬的。比如碰到5,就將小於等於5的都入棧(1,2,3,4,5),然是將5出棧(判斷這時棧頂一定是5),同樣地,之後遇到4,已經沒有什麼可入棧了,棧頂是4,出棧,再遇到1,同樣沒什麼可入棧的,棧頂元素是3,不是1,說明不可能。

1363 Accepted 156K 110MS C++ 1354B

/* 
ID: thestor1 
LANG: C++ 
TASK: poj1363 
*/
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <limits>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cassert>

using namespace std;

int main()
{
	int N;
	scanf("%d", &N);
	while (N)
	{
		int num;
		scanf("%d", &num);
		// the number of numbers input
		int cnt = 1;
		// fprintf(stderr, "num: %d, cnt: %d\n", num, cnt);

		if (!num)
		{
			printf("\n");
			scanf("%d", &N);
			continue;
		}

		int instacktop = 1;
		stack<int> outstack;

		bool flag = true;
		while (true)
		{
			while (instacktop <= N && instacktop <= num)
			{
				outstack.push(instacktop);
				instacktop++;
			}

			if (outstack.empty() || outstack.top() != num)
			{
				flag = false;
				break;
			}
			outstack.pop();

			if (cnt == N)
			{
				break;
			}

			scanf("%d", &num);
			cnt++;
			// fprintf(stderr, "num: %d, cnt: %d\n", num, cnt);
		}

		// get the rest of numbers
		while (cnt < N)
		{
			scanf("%d", &num);
			cnt++;
			// fprintf(stderr, "num: %d, cnt: %d\n", num, cnt);
		}

		if (flag)
		{
			printf("Yes\n");
		}
		else
		{
			printf("No\n");
		}
	}

	return 0;  
}