一天,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.
#includeusingnamespace
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...