UVA-514 Rails

UVA-514 Rails

image-20210205111836371

题意:

如图有一个铁路中转站,在A侧有\(n\)个车厢,从左到右编号分别为\(1,2,3..,n\),现在你可以通过中间的中转站(\(station\))对这些车厢进行重新排序。给出你重新排序之后的车厢编号问你是否合法。

需要注意的是,假如一个车厢从\(A\)进入了中转站,那么它只能从中转站进入到\(B\)而不能返回\(A\)。进入到\(B\)之后的车厢只能留在\(B\),不能返回中转站或者\(A\)


思路:

铁路中转站相当于一个栈。

从前到后在\(A\)中找\(B\)的数字。具体方法为如果\(A\)当前的数字与\(B\)当前的数字相等那么直接\(A++,B++\),如果不相等就检查一下栈顶是否与\(B\)当前数字相等,如果还是不相等,那么如果\(A\)还可以进栈(即\(A<n\)),那么就让\(A\)进栈。如果上述操作都不能进行了那么这个序列\(B\)就是非法的。


参考代码:

代码目前仅通过样例,正确性有待商榷,OJ最近进不去没法评测。

#include <cstdio>
#include <iostream>
#include <stack>

const int Maxn = 1005;

int a[Maxn];

void solve(int n) {
	for (int i = 1; i <= n; i++) {
		scanf("%d", a + i);
	}
	std::stack<int>s;
	int A = 1, B = 1;
	bool flag = true;
	while (B <= n) {
		if (A == a[B]) {
			A++;
			B++;
		} else if (!s.empty() && s.top() == a[B]) {
			s.pop();
			B++;
		} else if (A < n) {
			s.push(A++);
		} else {
			flag = false;
			break;
		}
	}
	printf("%s\n", flag ? "Yes" : "No");
}

int main() {
	int n;
	while (~scanf("%d", &n) && n) {
		solve(n);
	}
	return 0;
}

posted @ 2021-02-05 11:36  牟翔宇  阅读(48)  评论(0编辑  收藏  举报