星期三, 5月 02, 2007

題意 XD

前幾天(May 1, 2007)系上舉辦程式設計比賽,出了四道題目。其中一題大概是這樣的(題目卷收回去了,所以只能列出大概...):

今天有一由英文字母與括號組成的字串 S,可以對他們作 HEAD 與 TAIL 兩種操作,行為是這樣:若 S=a(bc),則 HEAD(S)=a、TAIL(S)=bc,若 S=(bc) 則 HEAD(S)=NULL、TAIL(S)=bc,若 S=a,則 HEAD(S)=NULL

範例輸入:
a(b(cd)))
TAIL
HEAD

範例輸出:
b

恩... 不要問我為什麼出這麼簡單的題目,因為我也不知道 = = 總之,看到這個題目,我想到類似以下的表格:

S HEAD TAIL
a(bc) a bc
(bc) NULL bc
a NULL(題目這樣說嘛!) a(猜的)

於是,寫出程式碼以後,驗證失敗... 花了些時間修改以後,最後還是錯誤。

比賽結束後,就去問監考老師,看能不能取得測試資料,順便問他我們到底錯在哪。當時他看了看題目以後,說「喔,應該是題目錯了,如果沒有這行(S=a HEAD(S)=NULL)就對了。」

那... 廢話嘛 = = 哪有「題目錯了,我們也就跟著錯了」這種事,當然要想辦法補救(至少要能讓人家覺得這是場公平的比賽)。可是當時老師跟助教就一付息事寧人的態度,對我們說「不然你是想要我怎樣?向全校公開道歉嗎?」實在很無言。就這樣,我們當天在系辦吵了兩個多小時。

後來,老師、助教、我們自己又調備份資料出來看,才終於弄懂到底錯在哪。原來題目跟測試資料都沒問題,是我們誤解了題意。如果 S=a(bc) 是 general case,括號前面的是 HEAD、裡面的是 TAIL。而 S=(bc) 是只有 TAIL 時的 special case, HEAD 是 NULL、TAIL 是括號中剩下的東西。而 S=a 是只有 HEAD 的 special case,不但 TAIL=NULL、連 HEAD 也一併變成 NULL 了。

嗯,好吧!的確是自己會錯題意,既然這樣就沒話說了。雖然我好像也測過 S=a HEAD=NULL TAIL=NULL 這種組合... 可能是其他部份的程式碼有問題吧!

後來我問我的隊友「我是不是很龜毛?」,他說「是,我當時就想叫你算了」。我告訴他的理由是,「因為這是比賽,我不願意在不明不白的狀況下贏過別人,也不能不明不白讓別人贏過我」。他後來也就理解了,也陪我跟老師囉唆了兩天 XD~

不過題外話... 有另外一題大概是這樣:

小明走在海邊檢石頭,每次只能撿比目前石頭重,而且不能往回走。而且為了避免一下子拿太重手臂負荷不了,所以只能拿比現在重十公斤以內的石頭。例如目前拿的石頭是 5kg,那麼下一次只能換成 6~15kg 的石頭。請問怎樣的拿法,可以達到最多交換次數?

範例輸入:
3 2 21 60 4 6 8 70 44 7 5 10 33 9 11

範例輸出:
6
2 4 6 8 10 11(我沒有實際算,這裡的答案是隨便唬嚨的...)

我一看到這個題目,就跟隊友說「這個可能有兩組最佳解吧?」,於是他就問老師「如果有兩組以上最佳解怎麼辦?」結果老師跟助教很肯定的跟我說「測試資料只有一組最佳解。」

很好,跑出來他的一些測試資料裡會有兩到三組最佳解 = = 嗯... 驗證失敗 XD~

搞成這樣我也不知道該說什麼,不過老師最後還是給我們對,但是時間就不知道該怎麼算了...

沒有留言: