题目:B - Rails
原题链接:https://cn.vjudge.net/contest...;
题目大意:先输入一个表示火车的节数,火车原本是按从1到n的顺序,但是一起进的还是分开进的是不一定的。之后输入自己的出站顺序,如果这个顺序可以实现,则输出yes,不能实现则输出no;
思路:利用栈的操作,即先将自己输入的第一个往后依次,先判断栈顶是否为空,如果为空,则从没用进入栈的火车头开始找,如果小于这个要找的元素,则进展,如果大于,则结束寻找,找完之后再判断其栈顶和自己找的是否一样(注意进栈的火车节不允许退出去),如果不为空则判断其栈顶是否一样,如果栈顶一样,则再从火车头中找比这个元素小的或者等于的入栈,最后比这个要找的元素小的或者等于全入栈之后,在判断其栈顶是否和要找的这个元素相同;(中间有些地方能直接判断不成立的,则可以直接退出)
代码:
#include<stdio.h>
#include<string.h>
int my_size=0;
int mystack[1010];
int main()
{
int N;
int a[1005],tag=0,temp=1,index;
while(scanf("%d",&N)!=EOF&&N!=0)
{
while(1)
{
my_size=0;tag=0;temp=1;
scanf("%d",&a[0]);
if(a[0]==0)
break;
index=1;
for(int i=1;i<N;i++)
scanf("%d",&a[i]);
for(int i=0;i<N;i++)
{
if(my_size==0)
{
if(index==a[i])
{
index++;
continue;
}
while(index<a[i])
{
mystack[tag++]=index++;my_size++;
}
if(index>a[i])
temp=0;
index++;
}
else
{
while(index<=N&&mystack[my_size-1]!=a[i])
{
mystack[tag++]=index++;
my_size++;
}
if(mystack[my_size-1]!=a[i])
{
temp=0;}
else
{my_size--;tag--;}
}
if(temp==0)
break;
}
if(temp)
printf("Yes\n");
else
printf("No\n");
}
printf("\n");
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。