hdu 1022 Train Problem I 棧
阿新 • • 發佈:2019-01-02
Train Problem I
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3121 Accepted Submission(s): 1148
OutputThe output contains a string "No." if you can't exchange O2 to O1, or you should output a line contains "Yes.", and then output your way in exchanging the order(you should output "in" for a train getting into the railway, and "out" for a train getting out of the railway). Print a line contains "FINISH" after each test case. More details in the Sample Output.
Sample Input
3 123 321 3 123 312
Yes. in in in out out out FINISH No. FINISHHintHint For 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.".
設進出兩個順序分別為order1和order2,如果此時棧為空或者當前的棧頂元素不等於order2[i],就讓order1[j]入棧,同時將"in"記錄入q佇列中。
else如果此時棧頂元素等於order2[i],就將此棧頂元素彈出(sk.pop()),並將"out"記錄入q佇列。
不斷進行上面上面兩個判斷,直到兩個陣列遍歷完,或者在中途中達不到目標順序,使程式停止。
上面程式碼較為簡略了,後來又寫了一次,下面程式碼比較清晰:
#include<iostream>
#include<string>
#include<vector>
#include"functional"
#include<memory.h>
#include<vector>
#include"numeric"
#include"algorithm"
using namespace std;
#define min(a,b)a>b?b:a
#define N 12
#define IN 0
#define OUT 1
char o1[N],o2[N];
int seq[N*2];
int idx;
int cal(int n)
{
int c1=0,c2=0;
vector<char> V;
//V.push_back(o1[c1++]);
while(c1<=n)
{
while(!V.empty()&&V.back()==o2[c2])
{
V.pop_back();
seq[idx++]=OUT;
c2++;
}
while((V.empty()||V.back()!=o2[c2])&&c1<=n)
{
V.push_back(o1[c1]);
seq[idx++]=IN;
c1++;
}
}
if(c2<n)
return false;
return true;
}
int main()
{
int n;
while(cin>>n)
{
idx=0;
cin>>o1>>o2;
if(cal(n))
{
cout<<"Yes."<<endl;
for(int i=0;i<n*2;i++)
if(seq[i]==IN)
cout<<"in"<<endl;
else
cout<<"out"<<endl;
}
else
cout<<"No."<<endl;
cout<<"FINISH"<<endl;
}
return 0;
}