1. 程式人生 > 其它 >js的釋出-訂閱者模式

js的釋出-訂閱者模式

A. Common Subsequence

題意:給出兩個數列,求最短公共子序列。

解:最短的,長度為1,如果連1個都沒有那也不可能有更長的。

B. Sequential Nim

題意:給出n堆石頭,依次取,每次取一堆,取完一堆才能取下一堆,個數不限。求最終誰能贏。

解:每堆石頭只有1個和多個的區別。如果輪到一個人,面前一堆只剩一個了,那他不得不取那一個,由此可見下一輪他也必然取剩下的一個,直到最後,對手將最後一堆直接取完,就輸了。如果途中又遇到1,那先手可以將上一堆取完,後手還是隻能取1。因此答案為序列中第一個非1的位置,輪到這裡的人必勝。

C. Prefix Flip

題意:給出兩個01序列a和b,每次可以選一個字首,將其01翻轉,然後將整個字首逆置。求一個對a進行不超過2n次操作的方案,使得a與b相同。

解:方法一分鐘,寫了一小時還沒調對,人是麻的。。。顯然一次反轉後第一個字元會變成最後一個。如果a的第一個字元與b的最後一個字元不同,操作後最後一位匹配;如果相同,那先反轉一次長為1的字首,再反轉當前字首,匹配成功。這樣從後往前,每個字元可以通過不超過2次操作使得它們一致,符合題意。

D. Unmerge

題意:給出一個2n的排列,問這個排列有沒有可能由2個長為n的序列從前往後按一次歸併排序中merge的方法得到。

解:既然只有一次merge,那不可能使它全部有序。設i<j,如果ai>aj,那麼它們顯然原來在一個序列中。如果它們不在一個序列中,那麼它們一定以有序的形式出現在最終結果中。也就是以第一個元素為首找一個上升子序列,由於是個排列,不可能出現相等的情況,子序列將原序列切分成好幾段,最後跑個揹包看看能不能拼出兩個長為n的序列。