EOJ3303 1 的個數最多的整數

2021-08-20 09:54:16 字數 1320 閱讀 5060

description

statistics

1 discussion

time limit per test: 2.0 seconds

memory limit: 256 megabytes

給定整數 a

和 b,輸出區間 [a,

b]中對應二進位制表示含 1 的個數最多的整數。

如果存在多個解,則輸出符合條件的最小的整數。

第一行乙個整數 t(1

≤t≤10

4),表示問題數。

接下來 t

行,每行兩個整數 a,b

(0≤a

≤b≤2

63−1)

。資料之間用乙個空格分隔。

共有兩組資料,分別為小資料和大資料,大資料範圍如上。對於小資料:t≤10

,a≤b

≤5⋅10

6。對於每個問題,輸出一行case x: y,其中 x 是問題編號,從 1 開始,y 是答案。

input

3

0 14

100 1000

3966869755091699093 4597827455649079876

output

case 1: 7

case 2: 511

case 3: 4035225266123964415

第乙個樣例資料:a=0

,b=14

,在 [0,

14]之間含 1 最多的整數為 7

(0111),

11(1011),

13(1101),

14(1110

),輸出最小的整數為 7

。 注意,第三組樣例不會出現在小資料中。

題解:再次感嘆一下位運算的神奇

好了中文題意不解釋,耿直列舉肯定會超時考慮位運算。

因為要求大於a的最小又要求1最多,那麼觀察a的二進位制從低向高不斷的把0變成1就可以了

找出那個比b小的輸出即可。

那麼用bitset可以很方便地實現。

這裡的話再提供乙個不用轉二進位制處理的方法。

直接ans|ans + 1就可以把最低的那個0變成1,神奇啊!

然而我愛bitset

#include using namespace std;

ll w[70];

int main()

}cout << "case " << i << ": ";

cout << ans << endl;

}return 0;

}

EOJ 3303 1的個數最多的整數(位運算)

題意 給定整數 a 和 b,輸出區間 a,b 中對應二進位制表示含 1 的個數最多的整數。如果存在多個解,則輸出符合條件的最小的整數。由於資料量較大,因此窮舉只能過50 的小資料,ab數值一大就超時。直觀地看,要讓區間 a,b 內1的個數最多,那就要在左界a的基礎上,在它的二進位制串上盡可能增加1,...

取出現次數最多的K個數

搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1 255位元組。假設目前有一千萬個記錄 這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請你統計最熱門的10個查詢串,要求...

找出出現次數最多的幾個數值

這道題目所說的出現最多的幾個數值,其實是帶有附加條件的 這幾個數值中出現次數最少的那個數,要比除這幾個值外的其他數的總個數要多。說的自己都有點暈 這樣才能在最後結果中,呈現這幾個數。所以必須按照資料來源中的統計量分析出求前幾位的數值。其 如下 include include using namesp...