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