P1582 倒水(C 數論 進製)

2021-10-02 16:30:10 字數 1007 閱讀 9584

一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著~~cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子,把乙個瓶子的水全部倒進另乙個裡,然後把空瓶丟棄。(不能丟棄有水的瓶子)

顯然在某些情況下cc無法達到目標,比如n=3,k=1。此時cc會重新買一些新的瓶子(新瓶子容量無限,開始時有1公升水),以到達目標。

現在cc想知道,最少需要買多少新瓶子才能達到目標呢?

一行兩個正整數, n,k(1≤n

≤2×1

09,k

≤1000

1\le n\le 2\times 10^9,k\le 1000

1≤n≤2×

109,

k≤10

00)。乙個非負整數,表示最少需要買多少新瓶子。

輸入 #1

3 1輸出 #1

輸入 #2

13 2

輸出 #2

輸入 #3

1000000 5

輸出 #3

這就是這個題和進製之間的關係:(具體思路看**注釋!)

合併前二進位制

合併後1個瓶子

11個瓶子

2個瓶子

101個瓶子

3個瓶子

112個瓶子

4個瓶子

1001個瓶子

5個瓶子

1012個瓶子

6個瓶子

1102個瓶子

7個瓶子

1113個瓶子

8個瓶子

1000

1個瓶子……

#include

using

namespace std;

intjudge

(int p)

//計算二進位制中1的個數

return num;

}int

main()

cout << ans;

return0;

}

P1582 倒水(數論??暴力!!)

這個題我很無語,一開始看綠題,還是數論,應該不會特別簡單,應該要動筆寫上好一會,過了一會旁邊 祝神說這原來是個藍題,我頓時覺得十分迷茫。結果看了這個題看了一會,仔細一想,woc,這題怕不是可以暴力出解,況且這個範圍確實也夠了啊,妥妥0ms出解。就試著打了一下。然後t兩個點。過了一會,發現2在進行乘的...

P1582 倒水(思維)

思路 首先如果乙個數等於2的n次方,那麼合併後一定是1個瓶子。而2的n次方中1的個數也是1個,13的二進位制1 1 0 1,二進位制1的個數3個,剛好13合併後是3個瓶子。我們可以得到乙個數二進位制1的個數就是這個數合併後的瓶子個數。我們在學樹狀陣列時有乙個lowbit函式 x x 就是取最後一位1...

P1582 倒水 題解

來水一發水題。題目鏈結。正解開始 首先,我們根據題意,可以得知這是乙個有關二進位制的題目 具體什麼關係,怎麼做,我們來具體分析 對於每個n,我們嘗試將其二進位制分解,也就是100101之類的形式 根據瓶子合併的特性,我們可以判定最後每乙個瓶子內的水都可以表示成2 i的形式 感性理解 對於每乙個數字上...