2017年2月18日星期六

UVa 514-Rails

       我个人刚刚接触C++ STL中栈的概念,所以通过UVa 514 这道题来进行一个练习。这道题也被收入在刘汝佳的书中。
       本身由于初学,只是为了练习stack的使用,基本的思路还是参照刘汝佳书中的想法,尚不具备独创性。
       题目如下:

    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 file 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 file contains the lines corresponding to the lines with permutations in the input file. A line of the output file contains ‘Yes’ if it is possible to marshal the coaches in the order required on the corresponding line of the input file. Otherwise it contains ‘No’. In addition, there is one empty line after the lines corresponding to one block of the input file. There is no line in the output file corresponding to the last “null” block of the input file.
Sample Input
1 2 3 4 5 
5 4 1 2 3 
6 5 4 3 2 1 
Sample Output 
          Yes
           No
 
           Yes

火车铁轨如图所示
    题意是说,对于n辆(编号从1-n的)车厢,从A站出发,经由中转站C,能否以输入方式到达B站。例如,对于5辆车厢,顺序(1,2,3,4,5)显然可以到达,而(5,4,1,2,3)则不行。
    由于C站有明显的后进先出(Last In First Out,LIFO)特点,因此它是一个栈。
    用A和B分别表示车厢的顺序:A表示在车站A最外侧即将发动的车厢的编号,而B表示在车站B下一辆需要到达的车厢编号。而数组target则用来储存需要被判断是否可行的到达顺序。
    当B中需要编号为 i 的车厢时,能够满足的情况有两种,一是A的最前方是车厢 i;第二种是栈C最顶端是这节车厢 i。如果不满足,那么车厢 i 就只有压入中转站C里等待了。
    一个要注意的问题是输出格式,每一个输入都对应一行,如果是输入0,应该对应一个空行。
    则代码如下:

#include <cstdio>
#include <stack>
using namespace std;

int main(void)
{
 int n,target[1005] = {0};
 while(scanf("%d",&n) == 1 && n){
  stack<int> s;
  
     while(1){
      int A = 1, B = 1;
      for(int i = 1; i<=n; i++){
          scanf("%d",target+i);
          if(target[1] == 0)
              break;
      }
  
  if(target[1] != 0){
   bool flag = true; 
   while(B <= n){
    if(A == target[B]){
     A++,B++;
    }
    else if(!s.empty() && s.top() == target[B]){
     s.pop();
     B++;
    }
    else if(A <= n) 
       s.push(A++);
    else{
     flag = false;
     break;
    }
   }
   printf("%s\n", flag? "Yes" :"No");
   
  }
  else {
   printf("\n");
   break;
  }
 }
     
 }
 return 0; 
}

2016年12月31日星期六

2016年过去了,我不知道我是否怀念它

 今天是2017年1月1日,我把雪白的新日历打开,翻到第一页的位置。它所记载的每一个日期,至今都尚无我的涉足。然后今天,我要在上面留下第一个脚印。想到这一点,我忽然觉得非常奇妙。
       去年的这个时候,我拥有另外一本日历。直到昨天,我才给它留下最后一个脚印。现在回头望去,我不知道自己留下的是怎样的一段旅程。

       我记得我当时飞快地翻到了日历的第六页,在上面第七个日期用荧光笔画了一个圈以示标记。但这个圈在这年一整个夏天里的我看来仿佛一个恐怖的魔障,一个逃不过的预言。日历翻过前6页的速度比我想得要快,当然,后6页也是一样。

      7月份的时候我想恐怕这是我生命里最糟糕的一年了,但又是5个月过去了,现在的我却不觉得它有那么糟糕。它不太好,但也没那么坏。这一年我18岁了,和我的朋友们在一起度过了半年,在夏天的时候我们都有好好告别,然后各自前往自己反复纠结最终选择的那座城市度过另外的半年。

      我觉得2016是一个关于“改变”的年份。这一年我和我的朋友们的生活都发生了非常巨大的改变。有的人的改变是完美的,可能值得用一辈子来怀念;另一些人的改变是带有遗憾的,也许就比如我,但这遗憾也不需要用一生去悔恨;还有一些朋友最终作出了更加有勇气的选择,我祝福他们在2017的尾巴回看的时候,觉得这一年非常完美。

      现在我们每个人都走在全新的征程上,期待自己能变成很厉害很厉害的人。我们眼前的路不再如以前一样被完整地规划好,但这份神秘却显得更加迷人。

      于已经成为往事的高考,现在想想,让我伤心的恐怕其实是混杂在一起的三种情绪。第一种是“那些我曾经看不上的大学,如今我都没有选择的机会了”,第二种大概是“他们没有我强,为什么能够拿比我更高的分数去更好的学校”,第三种是“我这样非常对不起自己的家人”。

      现在看看,前两种情绪无非就是一种古怪的自负和卑劣的嫉妒罢了;至于第三种,我承认这也许是事实,但我是为自己在活。

      我现在在一所很好的学校,这所学校里有很多很强的人,在新的一年的,我还要付出更多去试图超越他们;我在学自己感兴趣的专业,虽然我知道的还很少,但我希望有一天变成一个很强的程序员。

      你看,关于未来的一切决定权都还在我手里。如果我做的足够好,我依然能够实现一切;就像六月份之前的我一样。所以这发生的一切,对我生活的影响并没有我当时想象的那么大。一切持续的消极都是错误的。


   但另外一方面,我仍然必须承认,我对过去一年的自己非常不满意。/*是啊是啊,要是满意我也不会考出这样的高考成绩对吧哈哈*/

     总结下来主要有下面几点:

  1. 没有计划。生活得混乱无章,太随性了。这一点在年末的时候略有改观,但还很不够。
  2. 缺乏自律。和很多人一样,也许我更严重些。在学习生活的时候,我好像经常忍不住打开手机。这严重影响了我的工作效率和生活乐趣。
  3. 三分钟热度。在过去一年里,如往年一样,我对很多事情产生了兴趣,但最终一年下来也都止于浅尝辄止,最终也没能某个方面让自己获得什么值得提起的小成就或者小进步。
  4. 情绪管理。我常常会陷入一些非常消极的情绪黑洞里,并且很难依靠自己渡过这样的关卡。也许是因为初次离家这么长时间的缘故吧,但新的一年我希望这样消极的时刻能少一些,也希望我能够坚强到足以自己解决。
  5. 阅读量不足。这一条其实可以归入第一条或者第三条里,但我单独罗列出来以突出这个问题的重要性。在上半年我仍然阅读了很多书籍,不过书籍的范围也非常狭窄,主要是科幻类和武侠类的通俗小说,名人传记,和很少的一部分纯文学(其他就是一些不足提起的杂志了)。下半年我的阅读量大大减少,我认为这很大程度上仍然是因为高中毕业后我拥有了手机的缘故:在闲暇的时候,我不再会选择看书,而是选择看手机。这是一个不那么积极的信号,新的一年我希望有所改变。
 以我希望新的一年自己能针对这些问题做一些改变,为此我甚至第一次制定了一份粗略的新年计划。老实说我对目前的自己能否有恒心执行一份跨度长达一年的计划感到怀疑,但我还是把它写下来了,希望明年此时看到的时候,我不要过于羞惭:

  1. 我希望自己能开始使用并逐渐做到熟练使用C++。非常遗憾,我在大学前没有任何计算机的基础,直到2016年的尾巴我还没有学好C语言。但因为我心里有关于ACM的小野心,所以我希望自己能在新一年的用好C++。
  2. 我希望自己能大致了解算法和数据结构的知识。同样是因为我想要参加ACM。3月份的新生赛可能不会是我的机会,因为我会的东西还太少太少了,而过去的半年我很大程度上又荒废了,但我没打算这么快就放弃。
  3. 我希望这一年我能准备好或者甚至就在这一年参加托福考试。
  4. 我希望这一年能看完35本书,无论篇幅。内容在满足我个人兴趣和需要的前提下,尽可能丰富。 
  5. 我希望这一年我能交到更多朋友,希望我的性格能更加温和谦卑。
这是我的2016,如我之前所说,我过得不算太好,也不算太坏。我有我的父母和其他家人,有一群我相信可以陪伴终生的朋友,有一个值得奋斗的目标,目前还欠缺的是我的实力和足够的执行力,以及一个女朋友。它现在已经完全过完了,一分钟都不剩了,我不知道自己是否怀念它,更不知道再过10年我想起它会是怎样的心情和想法。


但我现在知道,对于眼前我刚留下第一个脚印的2017,我很期待它。