p1582 倒水 (位運算)

2021-09-24 09:31:28 字數 1026 閱讀 5384

p1582

題目描述

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

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

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

輸入輸出格式

輸入格式:

一行兩個正整數, n,k(1\le n\le 2\times 10^9,k\le 10001≤n≤2×10

9,k≤1000)。

輸出格式:

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

輸入輸出樣例

輸入樣例#1:

3 1輸出樣例#1:

1輸入樣例#2:

13 2

輸出樣例#2:

3輸入樣例#3:

1000000 5

輸出樣例#3:

15808

分析:每個瓶子的是的公升數一定是2的k次方(k可以為0)

那麼最後保留k個瓶子,那麼最後總的公升數的二進位制表示中,1的個數一定<=k。

一直加水,直到1的個數等於k就行了

(當然不是一直加1而是加2某次方)

code:

#include

#include

typedef

long

long ll;

const

int inf=

0x3f3f3f3f

;const

int inn=

0x80808080

;using

namespace std;

intcot

(int x)

return ans;

}int

main()

cout

}

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的形式 感性理解 對於每乙個數字上...

洛谷P1582 倒水

一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著 cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子,把乙個瓶子的水全部倒進另乙個裡,然後把空瓶丟棄。不能丟棄有水的瓶子 顯然在某些情況下cc無法達到目標,比如n 3,k 1。此時cc...