一本通1357

一本通3.1栈黄色线:2020.3.9

1357

熟悉的图又回来了,其实这一次就一道题,还特简单的一道

1357:车厢调度·


题目的一个缩略

因为这次就一道题,我代码就写得细一点,前面的代码解释太少了,我把思路也写写

思路一:

模拟算法,因为a[i]出栈前,若他在B轨上,则1~a[i]-1这些数都得在栈中或出栈,所以我就叫之前的全进栈,至C中;而a[i]若在栈中,压在前面的必须出去,“放空”通道,让a[i]出栈。详见代码解释。

#include <bits/stdc++.h>

using namespace std;

int a[1050],n,nown=1;

//nown是当前从B轨入栈的序号,当前进入到第几个了

//因为我是有序进栈,那就是最后进栈的编号

stack<int> s;//栈

//stack(栈)可用数组代替,但我更喜欢用stack,操作起来方便,也好用

int main()

{

  cin>>n;

  for(int i=1; i<=n; i++) cin>>a[i];//输入

  for(int i=1; i<=n; i++)

  {

    while(nown<=a[i])//若在B轨上

      s.push(nown++);//把前面的压入

    if(s.top()==a[i]) s.pop();//如果栈顶是当前的要出栈车厢号,那么就出栈。

    else//不然就说明无法达到目标,输出“NO”

    {

      cout<<"NO\n";//一定要大写哦

      return 0;

    }

  }

  cout<<"YES\n";//大写哦

  return 0;

}


思路二:按题目说的方法

//

     从第一个数字开始扫描,a[i]表示当前出栈的数字,如果有比a[i]大的数字还在栈中,那么就产生矛盾,输出“NO”;否则,标记当前数字a[i]为栈后状态,那么[1, a[i]-1]这些数字如果还没出栈,标记为栈中状态。具体我们可以用0表示为确定状态,1表示栈中状态,2表示栈后状态。                                                                                                                                                                                                      ——ybt一本通(🐏鼻涕)官方网站

//

那就简单了,代码嘛,直接上

#include <bits/stdc++.h>

using namespace std;

int sta[1050],a[1050],n,top,nown[1050];

int main()

{

  cin>>n;

  for(int i=1; i<=n; i++)

  {

    cin>>a[i];

    if(nown[a[i]]==1)//在栈中

      if(sta[top--]==a[i])//最上面

        nown[a[i]]=2;//推到栈后

      else

      {

        cout<<"NO"<<endl;

        return 0;//输出不可能

      }

    for(int j=1; j<a[i]; j++)//前面未入栈的

    {

      if(nown[j]==0)

      {

        nown[j]=1;

        sta[++top]=j;

      }//入栈

    }

    nown[a[i]]=2;//a[i]出栈(栈后)

  }

  cout<<"YES"<<endl;

  return 0;

}

这种方法有点烦,不过也是一种好的方法,能过就行。


        总结一下,两种方法,各有各的好处,当然,网上给的代码全是第一种,其实第二种也不错啦,看个人选择。有提示,顺着它最好,但用自己的方法,也不是说差。有兴趣的,可以像我一样,两种思路都码,可以练练手。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容