$\TeX$ 是一種由 Donald Knuth 所發展出的一套文書排版軟體。這套軟體可以將原始文件檔加上一些像字型等型態後,轉成一份很漂亮的文件。而一份漂亮的文件是需要用 ``" 來把別人說的話給「引」出來,而不是用大部份鍵盤上有的 "。雖然鍵盤裡通常不會有這種有方向的雙引號鍵,不過上面有左單引號 ` (有人叫 backquote),和右單引號 ' (有人叫 apostrophe 或 quote)。你可以在你的鍵盤上找一下,不過要小心不要將 `\ (backslash 鍵) 搞混了。而在 $\TeX$ 裡,使用者可以輸入兩個左單引號 `` 來構成一個左雙引號 ``,或者是兩個右單引號 '' 來構造一個右雙引號 '',不過呢,通常大家打字時都很習慣用普通的雙引號 " 來引述別人的話。

如果原始文件檔內容是:

"To be or not to be," quoth the bard, "that is the question."

則 TeX 作出來的文件並不會是我們所想要的:

``To be or not to be," quoth the bard, ``that is the question."

為了要得到上面的文件,我們需要把原始文件變成這個樣子:

``To be or not to be,'' quoth the bard, ``that is the question.''

你現在必須要寫一個程式,將普通的雙引號 ("),轉成有方向性的雙引號,而其它文字則不變。而在把普通的雙引號換掉的時候,要特別注意,當要開始引述一句話時要用 ``,而結束引述時要用 ''。不用擔心會有多層巢狀引號的情形,也就是第一個引號一定是用 `` 來代替,再來用 '',然後用 ``,接著用 '',依此類推。

Input and Output

輸入是若干列的文字,其中有偶數個雙引號 ("),以 end-of-file 做結束。輸出的文字必須和輸入的一模一樣,除了:

  • 每一組雙引號的第一個 " 必須用兩個 ` 字元 (就是 ``) 來代替
  • 每一組雙引號的第二個 " 必須用兩個 ' 字元 (就是 '') 來代替。

Sample Input

"To be or not to be," quoth the Bard, "that
is the question".
The programming contestant replied: "I must disagree.
To `C' or not to `C', that is The Question!"

Sample Output

``To be or not to be,'' quoth the Bard, ``that
is the question''.
The programming contestant replied: ``I must disagree.
To `C' or not to `C', that is The Question!''

給你一塊矩形土地的長寬,再依序給定每個機器人的初始位置狀況及一連串的指令集,你必須用你的程式求出每個機器人最後的位置狀況。

一個機器人的位置狀況包括了其坐標( x 坐標, y 坐標),和它面向的方向(用 N , S , E , W 來分別代表北、南、東、西)。至於一個機器人所收到的指令集,是一個由字母 ‘ L ‘ , ‘ R ‘ , 和 ‘ F ‘ 所構成的字串,其分別代表:

左轉(Left):機器人在原地往左轉 90 度。
右轉(Right): 機器人在原地往右轉 90 度。
前進(Forward): 機器人往其面向的方向向前走一格,且不改變其面向之方向。

從坐標 (x,y) 走至 (x,y+1) 的這個方向我們定義為北方。

因為此矩形土地是有邊界的,所以一旦一個機器人走出邊界掉落下去,就相當於永遠消失了。不過這個掉下去的機器人會留下「標記 ( scent ) 」,提醒以後的機器人,避免他們從同一個地方掉下去。掉下去的機器人會把標記,留在他掉落之前所在的最後一個坐標點。所以對於以後的機器人,當他正位在有標記的地方時,這個機器人就會忽略會讓他掉下去的指令。

閱讀全文 »

在數學或電腦科學裡,有些概念在一維或二維時還蠻簡單的,但到 N 維就會顯得非常複雜。試想一個 $n$ 維的「盒子」:在二維空間裡,盒子 $(2,3)$ 可代表一個長為 2 個單位,寬為 3 個單位的盒子;在三維空間裡,盒子 $(4,8,9)$ 則是一個 $4\times{8}\times{9}$ (長、寬、高) 的盒子。至於在六維空間裡,也許我們不清楚 $(4,5,6,7,8,9)$ 長得怎樣,不過我們還是可以分析這些盒子的特性。

在此問題裡,我們要算出一組 $n$ 維盒子裡,它們的「最長套入串列」:$b_1,b_2,\cdots{},b_k$,其中每個盒子 $b_i$ 都可以「放入」盒子 $b_{i+1}$ 中 ($1\leq{i} < k$)。

考慮兩個盒子 $D=(d_1,d_2,\cdots{},d_n)$$E=(e_1,e_2,\cdots{},e_n)$。如果盒子 $D$$n$ 個維,能夠存在一種重排,使得重排後, $D$ 每一維的量度都比 $E$ 中相對應的維的量度還要小,則我們說盒子 $D$ 能「放入」盒子 $E$。(用比較不嚴謹的講法,這就好像我們將盒子 $D$ 翻來翻去,看看能不能擺到 $E$ 裡面去。不過因為我們考慮的是任一重排,所以實際上盒子不只可轉來轉去,甚至還可以扭曲。)(還是看看下面的例子說明好了)。

譬如說,盒子 $D=(2,6)$ 能夠被放入盒子 $E=(7,3)$ 裡,因為 $D$ 可以重排變為 $(6,2)$,這樣子 $D$ 的每個維的量度都比 $E$ 裡對應的維還要小。而盒子 $D=(9,5,7,3)$ 就沒辦法放進盒子 $E=(2,10,6,8)$,因為就算再怎麼重排 $D$ 裡的維度,還是沒辦法符合「放入」的條件。不過 $F=(9,5,7,1)$ 就可以放入 $E$ 了,因為 $F$ 可以重排成 $(1,9,5,7)$,這樣就符合了放入的條件。

我們今定義「放入」如下:對於任兩個盒子 $D=(d_1,d_2,\cdots{},d_n)$$E=(e_1,e_2,\cdots{},e_n)$,如果存在一種 $1\cdots{n}$ 的重排 $\pi$,使得對於任何的 $1\leq{i}\leq{n}$,皆有 $d_{\pi{(i)}} < e_i$,則我們說盒子 $D$ 能「放入」盒子 $E$

閱讀全文 »

你即將開車出遠門,當然希望在車上能聆聽一些美好的音樂。你的車上只有播放錄音帶的設備,但是你最喜歡的音樂卻都存放在 CD 上。所以你需要把 CD 上的音樂轉錄到錄音帶上。現在你必須解決的問題是:你的空白錄音帶長共 $N$ 分鐘,你如何選擇 CD 上的歌使得盡可能的利用錄音帶的空間。以下是一些此問題的假設:

  • CD 上的歌最多不會超過 20 首。
  • 沒有任何一首歌的長度超過 $N$ 分鐘。
  • 要錄在錄音帶上的歌不能重複。
  • 每首歌的長度以一整數表達。
  • $N$ 也是一個整數。

你的程式必須找出該放哪些 CD 上的歌到錄音帶上 (按 CD 上的順序),使得錄音帶空白的空間最小。

Input

每組測試資料一列,第一個整數為 $N$,代表空白錄音帶的長度。第二個整數 $T$ 代表 CD 上共有多少首歌。接下來的 $T$ 個整數分別代表 CD 上每首歌的長度。以 Sample Input 中第一組測試資料為例說明:$N=5, T=3$, 第一首歌的長度為 1 分鐘,第二首歌的長度為 3 分鐘,第三首歌的長度為 4 分鐘。

Output

對每一組測試資料,輸出一列。內容為要放到錄音帶的各首歌的長度 (注意:此部分答案並非唯一,以第五組測試資料來說,43 2 也是正確的答案。本程式有特殊的檢驗程式,所以只要是正確答案都可被接受),以及總長度。請參考 Sample Output。

Sample Input

5 3 1 3 4
10 4 9 8 4 2
20 4 10 5 7 4
90 8 10 23 1 2 3 4 5 7
45 8 4 10 44 43 12 9 8 2

Sample Output

1 4 sum:5
8 2 sum:10
10 5 4 sum:19
10 23 1 2 3 4 5 7 sum:55
4 10 12 9 8 2 sum:45

很多人都知道銅線是荷蘭人發明的。聽說是有 2 個荷蘭人在爭奪一個銅幣,由於搶的太激烈,銅幣被約拉越長,最後銅線就被發明出來了。

現在,你要來幫助處理一個關於銅幣的問題。給你一袋銅幣 (裡面最多有 100 個,面值可能有 1 分錢到 500 分錢,但單一銅幣是不可分割的)。若要把銅幣分成 2 堆,並且使得這 2 堆銅幣的面值和盡可能接近,你必須回答這 2 堆銅幣面值和的差是多少。

Input

輸入的第一列有一個整數,代表以下有幾組測試資料。

每組測試資料 2 列,其中第一列有 1 個不為負的整數 $m$ ($m\leq{100}$),代表袋中銅幣的數目。接下來的一列有 $m$ 個正整數,代表袋中各銅幣的面值。

Output

對每一組測試資料,輸出 2 堆銅幣面值和的差是多少。

Sample Input

2
3
2 3 5
4
1 2 4 6

Sample Output

0
1

世界聞名的黑社會老大 Vito Deadstone 要搬到紐約來了。在那裡他有一個大家族,並且他們都住在 Lamafia 大道上。因為 Vito 時常要拜訪所有的親戚,他想要找一間離他們最近的房子,也就是說他希望從他的家到所有的親戚的家的距離的和為最小。

他恐嚇你寫一個程式來幫助幫助他解決這個問題。

Input

輸入的第一列有一個整數代表以下有多少組測試資料。

每組測試資料一列,第一個整數 $r$ ($0 < r < 500$),代表他親戚的數目。接下來的 $r$ 個整數 $s_1,s_2,\cdots,s_i,\cdots,s_r$ 為這些親戚房子的門牌號碼 ($0 < s_i <30000$)。注意:有些親戚的門牌號碼會相同。

Output

對每一組測試資料,輸出從他的新家到所有的親戚的家的距離的和為最小為多少。2 個門牌號碼 $s_i$$s_j$ 的距離為 $s_i-s_j$ 的絕對值。

Sample Input

3
2 2 4
3 2 4 6
4 2 1 999 5

Sample Output

2
4
1001

從前從前在古帝國有 2 座高塔位於 2 座城市中,他們的形狀不太相同。但是他們都是用圓柱形的石塊一個堆在另一個上面建起來的。每個圓柱形石塊的高度都相同 (定為 1),但是半徑卻不一。所以,雖然 2 座高塔的形狀不一樣,但事實上他們可能有許多石塊是相同的。

在高塔建成的一千年後,國王要求建築師拿掉高塔的某些石塊,使得 2 座高塔的形狀大小和高度一樣。但同時要盡可能讓高塔的高度越高越好。新高塔的石塊的順序也必須和原來的高塔一樣。國王認為這樣可以代表 2 座城市之間的和諧與平等。他為這 2 座高塔命名為「雙子星塔」。

現在,你的任務是就是算出這雙子星塔的高度。

Input

輸入含有多組測試資料,每組測試資料 3 列,代表原來 2 座高塔的資料。

每組測試資料的第一列有 2 個整數 $N_1$$N_2$ ($1\leq{N_1,N_2}\leq{100}$),代表這 2 座高塔原來的高度。接下來的一列有 $N_1$ 個正整數,代表第一座高塔石塊的半徑 (由高到低)。再接下來的一列有 $N_2$ 個正整數,代表第二座高塔石塊的半徑 (由高到低)。

$N_1=0, N_2=0$ 代表輸入結束。

Output

對每一組測試資料,輸出這是第幾組測試資料以及這2座塔後來的高度。每組測試資料後請空一列。請參考 Sample Output。

Sample Input

7 6
20 15 10 15 25 20 15
15 25 10 20 15 20
8 9
10 20 20 10 20 10 20 10
20 10 20 10 10 20 10 10 20
0 0

Sample Output

Twin Towers #1
Number of Tiles : 4

Twin Towers #2
Number of Tiles : 6
 

在資訊科學中有一些是關於在某些條件限制下,找出一些計算的最大值。

以歷史考試來說好了,學生被要求對一些歷史事件根據其發生的年代順序來排列。所有事件順序都正確的學生無疑的可以得滿分。但是那些沒有全對的人又該如何給分呢?以下有 2 種可能的給分方式:

  1. 每個與標準答案的順序相同的事件得 1 分
  2. 每個在最長 (但不一定要連續) 的序列事件中,其相對的順序亦可以在標準答案發現者,每個事件得 1 分。

舉例說明:如果有 4 個事件其發生時間的順序依次是 1 2 3 4 (就是標準答案啦,意思是第 1 個事件發生順序為 1、第 2 個事件發生的順序為 2、…)。所以如果學生回答此 4 個事件發生的順序依次是 1 3 2 4 的話,根據上面第 1 種方法可以得 2 分 (第 1 個及第 4 個事件)。但是如果以上面第 2 種方法可以得 3 分 (1 2 4 或者 1 3 4 其相對的順序可以在標準答案發現)

在本問題中,請你寫一個程式以第 2 個方法算出學生該得多少分。

閱讀全文 »

LISP是最早的高階程式語言之一,而Lists則是LISP中最重要的資料結構。Lists可以很簡單的用來表達其他的資料結構,例如:tree。在這個問題中,給你LISP中的S表示式(S-expression),請你寫一個程式判斷這表示式(整數的二元樹)是否存在一條由根節點到樹葉的路徑,且路徑上各節點的值的和為某一特定的數 n。例如:在以下的樹中共有4條從根到樹葉的路徑。而各路徑的和分別為27,22,26以及18。

在LISP中的S表示式有以下的格式:

empty tree ::= ()
tree ::= empty tree | (integer tree tree)

上圖中的樹若以S表示式表達為:(5 (4 (11 (7 () ()) (2 () ()) ) ()) (8 (13 () ()) (4 () (1 () ()) ) ) )

注意:在樹中所有的葉節點為 (integer () () )

既然空樹不存在任何根到葉的路徑,任何對空樹是否有某個和的詢問,其答案都是否定的。

閱讀全文 »

樹狀結構在電腦科學的許多領域中都相當重要。本問題牽涉到建立樹及走訪樹。

給你一二元樹,你的任務是寫一個程式來列印依「階層(level-order)」走訪的結果。在本問題中,二元樹的每個節點含有一個正整數,並且節點的數目最少1個,最多256個。

在「階層」走訪中,依階層從低到高,同階層從左到右的次序來列印。例如以下的二元樹階層走訪的結果為:5, 4, 8, 11, 13, 4, 7, 2, 1

在本問題中,二元樹以節點來表示。每個節點以一對(n,s)來表示。n代表此節點的值,s為一字串,代表從根節點到達此節點的路徑。其中L代表往左,R代表往右。所以在上方的圖中內容為13的節點其表示法為(13,RL),而內容為2的節點其表示法為(2,LLR),而根節點為(5,)。

閱讀全文 »