切換
舊版
前往
大廳
主題

ZeroJudge - e338: 放暑假了!!!!!...可惜要上暑輔...開學後還要模考... 解題心得

Not In My Back Yard | 2020-07-25 00:09:11 | 巴幣 2 | 人氣 271

題目連結:


題目大意:
輸入有多列,每列給定一非負整數 n (n < 2 ^ 31),請計算 n 在二進位下的表示中有多少個「1」的位元?



範例輸入:
1
2
3
4


範例輸出:
1
1
2
1


解題思維:
可以利用建表的方式,預先計算 0(含) ~ 65535(含) 各自數字有多少「1」的位元,作為一個查詢表。因為 65535 = 2 ^ 16 - 1 ,因此我們可以將給定的整數 n 分拆成兩等分——即前 16 位元以及後 16 位元。然後各自使用剛剛建立的查詢表去看有多少「1」,最後再加總即是所求。



但是因為這題的時限卡得非常地緊,光是用普通的輸入就會超時。所以需要搭配輸出入的最佳化,可是一般的最佳化也不太夠,基本上要自行撰寫,參見此題

即使如此還有點不夠,因此可以在程式碼最前面加一句 #pragma GCC optimize("Ofast")。#pragma 代表現在要對編譯器作一些設定、操作或是定義,最佳化就是其中一種設定,例如在這邊使用的 optimize("Ofast") 就是告訴 GCC 的最佳化選項為 Ofast。

最佳化相關可以這篇英文文章,裡面有比較各種選項的執行效率,不過沒有對各種選項做深入的解釋,有興趣的讀者可以自行研究、搜尋。但是在程式解題這個領域,通常光使用 Ofast 這個選項便足矣。




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

創作回應

更多創作