P1582 倒水 二進位制

2022-04-30 10:12:10 字數 1016 閱讀 5279

一天,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×109,k≤1000 )。

輸出格式: 

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

輸入樣例#1: 

3 1

輸出樣例#1: 

1

輸入樣例#2: 

13 2

輸出樣例#2: 

3

輸入樣例#3: 

1000000 5

輸出樣例#3:

15808

二進位製水題一道.

因為只有當有兩個相同的水瓶時才可以合併;

所以可以很快推出一條性質:

每個合併出來的水瓶最終水量必為 2 的 n 次方.

然後也就是說,把當前這個數轉化成二進位制,它共有多少位是 1 , 也就是它可以合併出來的水瓶.

因為只能加,所以我們就一步一步把這個數字跳為恰有 k 個1的最小值即可.

關於取一的個數;

樹狀陣列引用過乙個 x&(-x) 便能取出末尾的1.

每次取完減去即可,直到為0.

#includeusing

namespace

std;

intn,k,ans;

int pal(intx)

return

num;

}int

main()

P1582 倒水(二進位制)

p1582 倒水 評測方式 雲端評測 標籤難度 普及 提高 時空限制 1000ms 128mb 最新討論 推薦的相關題目 題目描述 一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著 cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子...

洛谷P1582 倒水 二進位制

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

P1582 倒水(C 數論 進製)

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