https://cn.vjudge.net/problem/UVA-514
uva好像有点卡 上了vj地址
看起来就是用栈 其实也不是很好想
简单说下思路 进栈顺序为A 1 2 3 4 5
出栈顺序给了B 同时有一个栈C 同时处理这几个部分
1.目的是B读取完毕 如果读不完 那么就出问题了 就是这个出栈序列是有问题的
2.如果A的数字和B的相同 那么直接省略这个车 A++ B++ 处理下一辆车
3.如果栈不空 且栈顶元素 和arr[B]相同 那么出栈 B++
4.如果A没有走完 A入栈 且A++
5.如果完不成234 那么就是失败了
越努力越幸运。
#include<algorithm>
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<ctime>
#include<map>
#include<stack>
#include<set>
#include<cstring>
#include<sstream>
using namespace std;
typedef long long ll;
const int maxn = 1e3 + 10;
int arr[maxn];
int main() {
int n, A, B, flag;//A代表车厢序号(1 2 3 4 5 6) B代表已经驶出B的车辆数
while (scanf("%d", &n), n) {
stack<int>s;
while (1) {
scanf("%d", &arr[1]);
if (arr[1] == 0) break;
for (int i = 2; i <= n; i++) {
scanf("%d", &arr[i]);
}
A = B = flag = 1;
while (B <= n)//未全驶出
{
if (A == arr[B]) {//进栈的车和驶向B的车相同
A++;
B++;
}
else if (!s.empty() && s.top() == arr[B]) {//栈顶和要出栈的相同
s.pop();
B++;
}
else if (A <= n) {
s.push(A);
A++;
}
else {
flag = 0;
break;
}
}
printf("%s\n", flag ? "Yes" : "No");
}
printf("\n");
}
return 0;
}







Comments | NOTHING