ETH官方钱包

切換
舊版
前往
大廳
主題

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

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

題目連結(jié):


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



範(fàn)例輸入:
1
2
3
4


範(fàn)例輸出:
1
1
2
1


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



但是因?yàn)檫@題的時(shí)限卡得非常地緊,光是用普通的輸入就會(huì)超時(shí)。所以需要搭配輸出入的最佳化,可是一般的最佳化也不太夠,基本上要自行撰寫,參見此題

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

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




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

創(chuàng)作回應(yīng)

更多創(chuàng)作