題目描述:
一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著~~cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子,把乙個瓶子的水全部倒進另乙個裡,然後把空瓶丟棄。(不能丟棄有水的瓶子)
顯然在某些情況下cc無法達到目標,比如n=3,k=1。此時cc會重新買一些新的瓶子(新瓶子容量無限,開始時有1公升水),以到達目標。
現在cc想知道,最少需要買多少新瓶子才能達到目標呢?
輸入輸出格式:
輸入格式:
一行兩個正整數, n,k(1≤n≤2×10^9 ,k≤1000)。
輸出格式:
乙個非負整數,表示最少需要買多少新瓶子。
思路:
2的n次方個瓶子可以合併成乙個瓶子,把n個瓶子轉化成二進位制來表示比如13變成1101,2的3次方+2的2次方+2的0次方,共可以合併成3個瓶子,也就是13的二進位制中1的個數。
我們可以每次求出二進位制中1的個數,如果小於等於k就完成了,否則從低位開始,找到第乙個1,用乙個數和這個1合併,並進製,消除低位的1,完成一次後再重複上述操作。
這裡需要注意的是求二進位制1的個數和&運算子的應用。
**:
#include
using namespace std;
intmain()
printf
("%lld\n"
,ans)
;}
洛谷P1582 倒水 二進位制
一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著 cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子,把乙個瓶子的水全部倒進另乙個裡,然後把空瓶丟棄。不能丟棄有水的瓶子 顯然在某些情況下cc無法達到目標,比如n 3,k 1。此時cc...
P1582 倒水(二進位制)
p1582 倒水 評測方式 雲端評測 標籤難度 普及 提高 時空限制 1000ms 128mb 最新討論 推薦的相關題目 題目描述 一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著 cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子...
P1582 倒水 二進位制
一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著 cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子,把乙個瓶子的水全部倒進另乙個裡,然後把空瓶丟棄。不能丟棄有水的瓶子 顯然在某些情況下cc無法達到目標,比如n 3,k 1。此時cc...