前往
大廳
主題

ZeroJudge - f634: 士兵歸來 解題心得

Not In My Back Yard | 2021-03-19 19:54:15 | 巴幣 0 | 人氣 301

題目連結:


題目大意:
輸入第一列給定兩正整數 N 、 M (1 ≦ N 、 M ≦ 1,000,000),代表原先有 N 位士官兵。而生還回來並記錄的有 M 筆(可能有重複登記)。

接著有 M 列輸入,每列給定一個字串 S 以及兩個整數 A 、 B (1 ≦ |S| ≦ 10,且 S 只由大寫英文字母組成,1 ≦ A 、 B ≦ 3),字串代表本次紀錄的士官兵之姓名、後兩個整數代表該名士官兵的軍種(1 、 2 、 3 依序代表海軍(Navy)、陸軍(Army)以及空軍(Air))以及軍階(1 、 2 、 3 依序代表軍官(Officer)、士官(Sergeant)、士兵(soldier))。

如果有多筆紀錄其士官兵的姓名、軍種以及軍階全數相同,則將這些紀錄視為同一人物(只有一或二項相同則不)。

試問每個軍種的生存人數、每個軍階的生存人數以及最後的生還率。輸出格式參見範例輸出。



範例輸入:
15 10
ABC 1 2
ABC 2 1
ABC 2 1
ACD 3 3
ACD 1 2
ACD 1 1
BBC 2 1
BBC 1 2
BBC 1 2
BBE 3 3


範例輸出:
navy:4 army:2 air:2
officer:3 sergeant:3 soldier:2
survival rate: 53.3%


解題思維:
對於 C++ 來說,直接使用內建的容器 Set 把每個士官兵的資料存起來即可。對於每筆紀錄,先判斷該紀錄的士官兵有無在 Set 裡,如果有代表已經統計過該位士官兵了,因此跳過;反之,將該位士官兵納入其所屬的軍種以及軍階之計數之中,這樣便可以確保不會重複計算到同一人物。

最後,容器 Set 的大小即是生存人數 C,有了人數之後便可以計算生還率,即
生存人數 C ÷ 原先人數 N × 100%
然後按照格式輸出各軍種、軍階之計數以及生還率即可。




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

創作回應

心彩
這題是不是不給你用cin cout呀 換個輸入就過不了
https://gist.github.com/buanyz03/47019c33dbdcd9940c9ede0bfadf0895
2024-03-04 17:23:32
Not In My Back Yard
似乎是如此。

我的建議是在 ZeroJudge 一旦遇到輸入資料很大,「感覺」輸出入會是瓶頸的時候就先改用 scanf 、 printf。因為如果連這兩個都不夠快,通常就是要強制你自己寫輸出入最佳化了,參見 https://home.gamer.com.tw/artwork.php?sn=5136724 。

不過我很久沒有解 ZeroJudge 了,不知道執行和編譯環境有沒有變化。
2024-03-04 19:46:45

更多創作