切換
舊版
前往
大廳
主題

ZeroJudge - d835: NOIP2003 1.乒乓球 解題心得

Not In My Back Yard | 2020-09-13 00:00:05 | 巴幣 2 | 人氣 122

題目連結:


題目大意:
輸入有多列,每列給定最多 20 個字元(當遇到字元「E」時,代表輸入結束,忽略其後多餘的字元)。每個字元代表一球的結果,字元只會是「W」或是「L」,前者代表華華的勝利、後者則代表對手的勝利。

比分的格式為「華華:對手」,例如 11:0 代表著華華在這局贏了 11 球、對手則是贏了 0 球。請在輸入完所有字元後,輸出 11 分制下每局的比分以及 21 分制下每局的比分。

例如:WWWWWWWWWWWWWWWWWWWWWWLW,代表著現在是 11 分制下的第三局比賽。第一局為 11:0 、第二局為 11:0 、目前的第三局比分則為 1:1;而如果在 21 分制下,現在是第二局,第一局是 21:0 、第二局則是 2:1。

輸出格式參見範例輸出。

注:比賽有著延長賽的機制。例如 11 分制,就是當兩人都拿 10 分而平手後,先拿下對手兩分的人則獲勝,否則繼續直到有人多贏對手兩分;21 分制的也是類似,但是以 20 分為界線。



範例輸入:
WWWWWWWWWWWWWWWWWWWW
WWLWE


範例輸出:
11:0
11:0
1:1

21:0
2:1


解題思維:
因為字元數並未給定,因此使用可以變動大小的資料型態才是適合的。例如 C++ 中的 vector,每個元素存一對數字 (L, R),代表著 L:R 的比分。

每遇到一個「W」,將目前 vector 最尾端(也就是最新的一局球局)的 (L, R) 數對,將 L 加 1 ;反之,遇到「L」時,則將 R 加 1 。

然後判斷現在這局 (L, R) 兩數是否有其中一者 ≧ X 且滿足 abs(L - R) ≧ 2 ,其中 X = 11 或是 21,端看目前要模擬的比分制。如果滿足,則代表要進行下一局的比賽,因此在 vector 後面新增一對 (0, 0) 的數對。

然後接著將 11 分制的每一局之比分,也就是將每一對 (L, R) 之 L 、 R 輸出為 L:R 之格式。而 21 分制也是比照辦理。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作