P1582 倒水(二進位制)

2021-09-24 12:09:43 字數 2610 閱讀 8104

p1582 倒水

評測方式 雲端評測

標籤難度 普及+/提高

時空限制 1000ms / 128mb

最新討論

推薦的相關題目

題目描述

一天,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×10

9,k≤1000)。

輸出格式:

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

輸入輸出樣例

輸入樣例#1:

3 1
輸出樣例#1:

1
輸入樣例#2:

13 2
輸出樣例#2:

3
輸入樣例#3:

1000000 5
輸出樣例#3:

15808
ac_code:

/*這題沒有提高難度,就是普及吧~

實質是二進位制的應用吧

/自己是這樣做的

/補充乙個解釋:

a:瓶子先水量相同的兩兩合併,如果是一開始n為奇數,肯定會剩下乙份不能兩兩合併的,如果是偶數,就剛好兩兩合併,不會剩下。如果剩下乙份,這乙份的水量 肯定是這次能合併的任意乙份水量的 1/2。

經過兩兩合併後,瓶子剩下的個數為n/2,除了那個不能合併的(水量不變),每個瓶子中的水量為之前的兩倍,

對剩下的水量相同的繼續兩兩合併,即重複a。。

經過多次a操作後,最後沒有能兩兩相同水量的合併了,即現在剩下的都是每次a操作剩下的不能進行兩兩相同合併的瓶子,如果此時瓶子個數小於等於m則不需要買瓶子,否則,這樣買:

先買第一次a操作與第二次a操作剩下那個瓶子的水量的差值個瓶子,使它又可以兩兩合併,再直到不能兩兩合併,重複這個購買操作,直到剩下的瓶子小於等於m

舉個例子:

n = 7 m = 2

第一次a:7/ 2 = 3 ,7 % 2 = 1(剩下這個不能合併的瓶子水量為1)

第二次a: 3 / 2 = 1 ,3 % 2 = 1(剩下這個不能合併的瓶子水量為 2)

此時不能進行a操作了,剩下3個瓶子,瓶子水量分別為 :4 ,2 ,1

此時我們要先買1個瓶子,這時:4 ,2,1,1

又可以兩兩合併:

4 ,2 ,2

4 ,4(此時已經滿足條件)

8(當然購買這次後可以最終使它剩下1個水量為8的瓶子)

最後可以只剩下1個瓶子,所以買1個瓶子就可以了

(我們最初的目的是要先讓已有的瓶子經過合併後盡可能的少,所以一直重複a操作,直到不能再進行a操作)

*/way1:

#include

using namespace std;

typedef

long

long ll;

ll q[50]

;int

main()

ll head =

1,tail = k,len = y;

while

(head < tail && len > m)

} cout

}

做完之後去看題解

發現還可以寫的更簡單微妙些

(其實根據我自己寫的那份**也可以發現其中的奧秘所在:

n二進位制1的個數,為最初可以剩下的最少個數

之後,n += (n & -n)

//相當於使n的二進位制最後乙個1上加1,產生進製(連續的1變為0),

但是對於十進位制,瓶子加的個數肯定是(n & -n),所以ans += (n & -n),

直到n的二進位制1個數不超過m

)way2:

//bitset,lowbit

#include

#include

using namespace std;

typedef

long

long ll;

intmain()

cout

}

way3:

//__builtin_popcount lowbit

#include

using namespace std;

typedef

long

long ll;

intmain()

cout

}

*/

P1582 倒水 二進位制

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

洛谷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...