一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著~~cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子,把乙個瓶子的水全部倒進另乙個裡,然後把空瓶丟棄。(不能丟棄有水的瓶子)
顯然在某些情況下cc無法達到目標,比如n=3,k=1。此時cc會重新買一些新的瓶子(新瓶子容量無限,開始時有1公升水),以到達目標。
現在cc想知道,最少需要買多少新瓶子才能達到目標呢?
這道題看了很多大佬都是用位運算來完成的,但是我是借用優先佇列來模擬這個過程,也成功ac了。接下來講一下思路。
加入現在有9個瓶子,當前含水量都是1。
第一次合併含水量相同的瓶子,由9個1可以變成4個2和1個1。第二次繼續合併含水量相同的瓶子,由4個2和1個1變成2個4和1個1。第三次繼續合併後變成1個8和1個1。由於當前已經沒有含水量相同的瓶子了,所以第一步操作結束。
將8和1壓入優先佇列(小根堆)判斷現在堆元素個數是否大於k,如果大於k,就推出最小元素,結果result加上當前最小元素,然後將當前元素*2再壓入優先佇列,重複這個迴圈直至堆元素個數等於k。
#include #include #include using namespace std;
int n,k,o=1,ans;
int main()
o*=2;
n/=2;
}while(q.size() > k)else
}cout << ans << endl;
}
洛谷P1582 倒水
一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著 cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子,把乙個瓶子的水全部倒進另乙個裡,然後把空瓶丟棄。不能丟棄有水的瓶子 顯然在某些情況下cc無法達到目標,比如n 3,k 1。此時cc...
洛谷P1582 倒水
題目描述 這道題經歷了 70 80 90 100的坎坷路程 易得2的次方個瓶子可以倒在一起,所以只需要每一次找出n中最大的2的次方的數,將n減去這個數,k 直到k 1 然後找出比k大的最小2的次方數,用這個數減去k就是答案。然而我只得了70分,後來我想是不是2的31次方是不是不能用int,果然改了l...
洛谷P1582 倒水
一天,cc買了n個容量可以認為是無限大的瓶子,開始時每個瓶子裡有1公升水。接著 cc發現瓶子實在太多了,於是他決定保留不超過k個瓶子。每次他選擇兩個當前含水量相同的瓶子,把乙個瓶子的水全部倒進另乙個裡,然後把空瓶丟棄。不能丟棄有水的瓶子 顯然在某些情況下cc無法達到目標,比如n 3,k 1。此時cc...