題目描述:
acx在××
信競組學會資訊競賽,但是他的同學都很
巨,於是要他去買水,結果來到某個買水的商店(奇奇怪怪的商店)。
一天,acx
買了 n
個容量可以認為是無限大的瓶子
,初始時每個瓶子裡有
1 公升水。
acx發現瓶子實在太多了,
於是他決定 保留不超過
k 個瓶子。每次他選擇兩個當前含水量相同的瓶子合併
,把乙個瓶子的水全部倒進另乙個瓶
,然後把空瓶丟棄
(不能丟棄有水的瓶子)。
顯然在某些情況下
acx無法達到目標,
比如 n=3,k=1.
此時acx
會重新買一些新的瓶子(
新瓶子容量無限
,開始時有
1 公升水
),以達到目標。現
在acx
想知道,
最少需要買多少新瓶子才能達到目標呢
?讀入格式:
一行 兩個正整數 n,k(1<=n<=10^9 ,k<=1000)
輸出格式:
乙個非負整數,
表示最少需要買多少新瓶子。
樣例輸入:
3 1樣例輸出:
1solution:
將瓶子中水的體積轉換成二進位制,如1公升可寫成0000001,同理兩公升就是0000010。
題目合併的一定是相同的體積合併,所以容積一定是二的次方倍,這時候我們可以發現,二進位制數上的1就可以是乙個瓶子,這時候我們就可以將題目轉換成加數(數就是多加了幾瓶水),如樣例:11 加一變成 100 就只有乙個瓶子了。
所以題目就可以變成每次加x,使這個數二進位制時位上的1的個數小於k
為了方便我們每次就加上最後一位上表示的二進位制數如10010(2)時,就加10(2),使最後位置上的1進製從而減少1的個數。
這個題目需要感性理解下吧,理解**了還是不難的。就是一道套路題~
code:
1//it is coded by ning_mew on 11.1 :)
2 #include3 #include4 #include5 #include6 #include7 #include8
using
namespace
std;
9int
n,k;
10int need=0;11
int a[10000+10
];12
int num(int
s)15
return
numb;16}
17int
main()
25 printf("
%d\n
",need);
26return0;
27 }
P1909 買鉛筆 的題解
p老師需要去商店買n支鉛筆作為小朋友們參加noip的禮物。她發現商店一共有 33種包裝的鉛筆,不同包裝內的鉛筆數量有可能不同,也有可能不同。為了公平起 見,p老師決定只買同一種包裝的鉛筆。商店不允許將鉛筆的包裝拆開,因此p老師可能需要購買超過nn支鉛筆才夠給小朋 友們發禮物。現在p老師想知道,在商店...
SCOI2014極水的題解
話說scoi都考了1個月了,終於拿出決心把題解補完了,但都說了是極水的題解,大家就看著玩吧 day1 t1 目標是找最長不降子串行,先就有乙個比較顯然的結論,就是假如我們要拔高區間 l,r 將其換為 l,n 肯定不會讓答案變差 yy一下就發現這點很顯然 就可以得到乙個dp的大體思路了。就是dp i ...
雙11不動腦不傷錢躺著買的N個套路
今天是 11 月 9 日,距離雙 11 只剩下 48 小時不到了。滿減券 預付金 淘氣值 沒點奧數基礎,還真難在電商叢林中殺出一條血路。也因此,眾不由得感慨,每年的程式設計客棧雙11,都是一場對數學 閱讀理解的終極考驗。知道大家已經撓破頭皮,現在阿信君強勢安利大家一些不那麼燒腦的雙 11 信用卡購物...