題意:給定整數 a 和 b,輸出區間 [a,b] 中對應二進位制表示含 1 的個數最多的整數。如果存在多個解,則輸出符合條件的最小的整數。由於資料量較大,因此窮舉只能過50%的小資料,ab數值一大就超時。
直觀地看,要讓區間[a, b]內1的個數最多,那就要在左界a的基礎上,在它的二進位制串上盡可能增加1,同時不超過b。因為要求輸出最小的整數,所以要對a的二進位制串從低到高,嘗試讓處於低位的0變成1,直到超出b。
有兩種辦法:
如果某數字num低位有0, 可以通過讓num和num+1做或運算,將最低位變成1。這種方法不需要將ans顯式地轉為二進位制。注意相關變數保險起見要宣告為unsigned long long,原因是a,b可以取到263
−1,在a基礎上運算可能導致數值越界。
思想同上,只是用bitset類來存放二進位制數,用weight陣列存每個二進位制位對應的十進位制數,從低到高掃瞄bitset,出現0時,不使用位運算而是對a直接累加上十進位制數。注意變數也要宣告為unsigned long long,因為weight[64] = 264
>(2
63−1)
.
#include
using
namespace
std;
typedef
unsigned
long
long ull;
ull adding_solve(ull a, ull b)
ull bitset_solve(ull a, ull b)}}
return ans;
}int main()
return
0;}
EOJ3303 1 的個數最多的整數
description statistics 1 discussion time limit per test 2.0 seconds memory limit 256 megabytes 給定整數 a 和 b,輸出區間 a,b 中對應二進位制表示含 1 的個數最多的整數。如果存在多個解,則輸出符合...
取出現次數最多的K個數
搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1 255位元組。假設目前有一千萬個記錄 這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請你統計最熱門的10個查詢串,要求...
找出出現次數最多的幾個數值
這道題目所說的出現最多的幾個數值,其實是帶有附加條件的 這幾個數值中出現次數最少的那個數,要比除這幾個值外的其他數的總個數要多。說的自己都有點暈 這樣才能在最後結果中,呈現這幾個數。所以必須按照資料來源中的統計量分析出求前幾位的數值。其 如下 include include using namesp...