首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

解决acm上的wa的有关问题:栈输出序列

2012-03-03 
解决acm上的wa的问题:栈输出序列在北大acmonline上做题,1363题,总是wronganswer。现附上题目,和我的解答,请

解决acm上的wa的问题:栈输出序列
在北大acm   online上做题,1363题   ,总是wrong   answer。现附上题目,和我的解答,请指教!
Rails  
Time   Limit:1000MS     Memory   Limit:10000K
Total   Submit:5848   Accepted:2297  

Description
There   is   a   famous   railway   station   in   PopPush   City.   Country   there   is   incredibly   hilly.   The   station   was   built   in   last   century.   Unfortunately,   funds   were   extremely   limited   that   time.   It   was   possible   to   establish   only   a   surface   track.   Moreover,   it   turned   out   that   the   station   could   be   only   a   dead-end   one   (see   picture)   and   due   to   lack   of   available   space   it   could   have   only   one   track.  


The   local   tradition   is   that   every   train   arriving   from   the   direction   A   continues   in   the   direction   B   with   coaches   reorganized   in   some   way.   Assume   that   the   train   arriving   from   the   direction   A   has   N   <=   1000   coaches   numbered   in   increasing   order   1,   2,   ...,   N.   The   chief   for   train   reorganizations   must   know   whether   it   is   possible   to   marshal   coaches   continuing   in   the   direction   B   so   that   their   order   will   be   a1,   a2,   ...,   aN.   Help   him   and   write   a   program   that   decides   whether   it   is   possible   to   get   the   required   order   of   coaches.   You   can   assume   that   single   coaches   can   be   disconnected   from   the   train   before   they   enter   the   station   and   that   they   can   move   themselves   until   they   are   on   the   track   in   the   direction   B.   You   can   also   suppose   that   at   any   time   there   can   be   located   as   many   coaches   as   necessary   in   the   station.   But   once   a   coach   has   entered   the   station   it   cannot   return   to   the   track   in   the   direction   A   and   also   once   it   has   left   the   station   in   the   direction   B   it   cannot   return   back   to   the   station.  


Input
The   input   consists   of   blocks   of   lines.   Each   block   except   the   last   describes   one   train   and   possibly   more   requirements   for   its   reorganization.   In   the   first   line   of   the   block   there   is   the   integer   N   described   above.   In   each   of   the   next   lines   of   the   block   there   is   a   permutation   of   1,   2,   ...,   N.   The   last   line   of   the   block   contains   just   0.  



The   last   block   consists   of   just   one   line   containing   0.  

Output
The   output   contains   the   lines   corresponding   to   the   lines   with   permutations   in   the   input.   A   line   of   the   output   contains   Yes   if   it   is   possible   to   marshal   the   coaches   in   the   order   required   on   the   corresponding   line   of   the   input.   Otherwise   it   contains   No.   In   addition,   there   is   one   empty   line   after   the   lines   corresponding   to   one   block   of   the   input.   There   is   no   line   in   the   output   corresponding   to   the   last   ``null ' '   block   of   the   input.  

Sample   Input


5
1   2   3   4   5
5   4   1   2   3
0
6
6   5   4   3   2   1
0
0

Sample   Output


Yes
No

Yes


Source
Central   Europe   1997


我的解答:
用c++写的  
#include <iostream.h>
int   function(int   a[],int   n)
{
int   *b=new   int[n];
int   i,temp,j,k,g;
for(i=0;i <n;i++)
{
temp=a[i];
for(j=i+1,k=0;j <n;j++)
if(a[j] <temp)   b[k++]=a[j];
for(g=0;g <k;g++)
if(b[g+1]> b[g])   return   0;
}
return   1;
}
void   main()
{
int   n,i;
cin> > n;
while(n!=0)
{
int   *a=new   int[n];
cin> > a[0];
while(a[0]!=0)
{
for(i=1;i <n;i++)
cin> > a[i];
if(function(a,n))   cout < < "Yes " < <endl;
else   cout < < "No " < <endl;
cin> > a[0];
}
delete   a;
cin> > n;
}
}


[解决办法]
我的代码:
/*
author: TangQiao , Wind @ Beijing Normal University

problem name: Rails

source : PKU Online Judge

problem type: 模拟

problem description: 模拟进栈和出栈过程,看是否能够按题目所说顺利输出.

problem solution: 模拟

date : 2005.9.22

*/
#include <stdio.h>
#include <string.h>

int stack[1010];
int n;
int in[1010], a;
int p_in;
int top;
bool first = true;
int main()
{
int i;
while (1)
{
scanf( "%d ", &n);
if (n == 0) break;

if (first) first = false;
else printf( "\n ");
while (1)
{
scanf( "%d ", in+1);
if (in[1] == 0) break;
for (i=2; i <=n; ++i)
scanf( "%d ", in+i);

memset(stack, 0, sizeof(stack));

p_in = 1;
top = 1;
for (a=1; a <=n; ++a)
{
stack[top++] = a;
while (stack[top-1] == in[p_in] && top > 0 && p_in <=n)


{
top --;
p_in ++;
}

}

if (top ==1) printf( "Yes\n ");
else printf( "No\n ");

}


}


return 0;
}

[解决办法]
直接自己写一个堆栈模拟搜索就可以了吧

#include <iostream>
using namespace std;

int main()
{
int n,in[1000],out[1000],buffer[1000];
while(cin> > n)
{
if(n==0)
break;
while(cin> > out[n-1])
{
if(out[n-1]==0)
break;
for(int i=n-2;i> =0;i--)
cin> > out[i];
for(int j=0;j <n;j++)
{
in[j]=n-j;
buffer[j]=-1;
}

bool canGo=false;
int topIn=n-1,topOut=n-1,topBuffer=-1;
while(1)
{
if(topBuffer==-1&&topIn==-1&&topOut==-1)
{
canGo=true;
break;
}
if(topIn==-1&&(buffer[topBuffer]!=out[topOut])||topBuffer==n-1&&in[topIn]!=out[topOut])
{
canGo=false;
break;
}
if(out[topOut]==in[topIn])
{
topOut--;
topIn--;
}
else if(topBuffer!=-1&&out[topOut]==buffer[topBuffer])
{
topOut--;
topBuffer--;
}
else
{
buffer[++topBuffer]=in[topIn--];
}

}
if(canGo)
cout < < "Yes " < <endl;
else
cout < < "No " < <endl;
}
cout < <endl;
}
return 0;
}

已经ac了的代码

热点排行