P1582 倒水(思維)

2021-09-05 03:05:54 字數 550 閱讀 9335

思路:首先如果乙個數等於2的n次方,那麼合併後一定是1個瓶子。而2的n次方中1的個數也是1個,13的二進位制1 1 0 1,二進位制1的個數3個,剛好13合併後是3個瓶子。我們可以得到乙個數二進位制1的個數就是這個數合併後的瓶子個數。我們在學樹狀陣列時有乙個lowbit函式(x & -x),就是取最後一位1的值(注意是數值),舉個栗子:13二進位制 1 1 0 1  lowbit(13) = 1,12二進位制 1 1 0 0, lowbit(12) = 4。一開始n個瓶子,當合併後瓶子不夠時我們就可以新增 lowbit(n) 個瓶子,因為新增lowbit(n) 個瓶子原來的二進位制數剛好可以進製(也就是可以合併兩個瓶子),當二進位制1的個數小於等於k時就可以了。

#include using namespace std;

#define read(x) scanf("%d",&x)

int solve(int x)

return cnt;

}int main()

cout << ans << endl;

}

P1582 倒水 題解

來水一發水題。題目鏈結。正解開始 首先,我們根據題意,可以得知這是乙個有關二進位制的題目 具體什麼關係,怎麼做,我們來具體分析 對於每個n,我們嘗試將其二進位制分解,也就是100101之類的形式 根據瓶子合併的特性,我們可以判定最後每乙個瓶子內的水都可以表示成2 i的形式 感性理解 對於每乙個數字上...

洛谷P1582 倒水

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

洛谷P1582 倒水

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