Train Problem I
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11821 Accepted Submission(s): 4332



3 123 321 3 123 312
Yes. in in in out out out FINISH No. FINISHFor the first Sample Input, we let train 1 get in, then train 2 and train 3. So now train 3 is at the top of the railway, so train 3 can leave first, then train 2 and train 1. In the second Sample input, we should let train 3 leave first, so we have to let train 1 get in, then train 2 and train 3. Now we can let train 3 leave. But after that we can't let train 1 leave before train 2, because train 2 is at the top of the railway at the moment. So we output "No.".HintHint
分析:很典型的堆栈的题目,若图方便直接用STL或者用数组模拟出一个堆栈都可以
代码:
#include<iostream>
#include<stack>
#include <string>
using namespace std;
stack<char>s;
string stra,strb;
int i,j,k,n;
int result[9];
int main()
{
while(cin>>n>>stra>>strb)
{
i=j=k=0;
s.push(stra[i]);
result[k++]=1;
while(i<n&&j<n)
{
if(s.size()&&s.top()==strb[j])
{
s.pop();
result[k++]=0;
j++;
}
else
{
i++;
if(i==n)
break;
s.push(stra[i]);
result[k++]=1;
}
}
while(!s.empty())
s.pop();
if(i==n)
cout<<"No."<<endl;
else
{
cout<<"Yes."<<endl;
for(i=0;i<k;i++)
{
if(result[i])
cout<<"in"<<endl;
else
cout<<"out"<<endl;
}
}
cout<<"FINISH"<<endl;
}
return 0;
}
代码2:C语言数组模拟
#include<stdio.h> #include<string.h> int main() { int n; char a1[10]; char a2[10]; int b[10]; int c[1000]; while(scanf("%d",&n)!=EOF) { memset(c,0,sizeof(c)); int i=0,j=0,k=0,m=0; getchar(); scanf("%s",a1); scanf("%s",a2); b[0]=0; while(j<n) { if(b[0]==0) { m=0; b[m]=a1[i]-'0'; c[k++]=1; i++; m++; } else { if(b[m-1]==(a2[j]-'0')) { b[m-1]=0; m--; j++; k++; } else { if(i==n) break; b[m]=a1[i]-'0'; c[k++]=1; i++; m++; } } } if(b[0]==0) { printf("Yes.\n"); for(i=0;i<k;i++) { if(c[i]) printf("in\n"); else printf("out\n"); } printf("FINISH\n"); } else { printf("No.\n"); printf("FINISH\n"); } } return 0; }