倒水(rms2017模擬2 1) 推理

2021-08-07 17:37:22 字數 1588 閱讀 6527

倒水(water.cpp)

試題描述: 某一天,在 nh 學習 cs 的 zr 習得新的 acm 秘籍,驚奇的發現,每使用一次會額外

得到乙個容量無限大的瓶子,並且初始時每個瓶子裡有 1 公升水。當他一口氣使用了 n 次秘 籍後發現瓶子實在太多了,於是他決定保留不超過 k 個瓶子。規則是每次選擇兩個當前含 水量相同的瓶子進行合併,把乙個瓶子的水全部倒進另乙個瓶子,然後把空瓶砸碎。 顯然在某些情況下 zr 無法達到目標,比如 n=3,k=1。此時 zr 會重新使用秘籍獲得

一些新的瓶子(新瓶子容量無限,開始時有 1 公升水),以達到目標。 現在 zr想知道,除去一開始使用了n次秘籍,最少還需要使用多少次秘籍才能達到目

標?輸入格式

一行兩個正整數n,k(1<=n<=109,k<=1000)。

輸出格式

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

輸入樣例

3 1

輸出樣例

1資料規模

對於 30%的資料,n<=3*105;

對於 100%的資料如題目。

題解

題目要求只能把水量相同的合併,於是可以貪心地把能合併的都合併,可以發現最終的水量是一些2的冪次,而這些數值的和也就是瓶子的數量n。那麼最後剩下的瓶子個數就是n二進位制中「1」的個數。如果「1」的個數小於等於k,那就滿足要求了。如果大於k,假設n的二進位制中最後乙個「1」位置右數第k個,那麼就新增2k-1個新瓶,直到使得n的二進位制中「1」的個數減少到k個或以下。求某個十進位制下的數字在二進位制下有多少個「1」,可以不斷減lowbit的方法來求。

假設x的二進位制中最後乙個「1」位置右數第y個lowbit(x) = 2y-1.

時間複雜度:o(k)

空間複雜度:o(1)

**

#include

#define f(i,a,b) for( int i=(a);i<=(b);i++ )

#define n 1001

#define m 10001

#define ll long long

#define oo 0x7fffffff

using namespace std;

ll read()

while( ch<='9' && ch>='0' )

return f*s;

}ll m,n,k,t;

ll tot,ans;

ll a[n],b[n];

int fa,cnt;

ll init()

while( n>1 )

a[cnt]=1;

}ll cul( int x )

int mmax=max( x,cnt );

for( int i=mmax;i>=fa;i-- )

return t-m;

} int main()

fa=i;}}

cout0;}

RMS記錄管理系統,J2ME

記錄儲存系統 rms 中採用記錄的方式管理資料,根資料庫的概念有點相似,資料的讀取和訪問十分方便。儲存在記錄中的資料會永久存在一直到midlet被刪除,因此 非常適合應用程式儲存一些運用相關的資料,例如,遊戲中的存檔資料等。開啟記錄集 trycatch exception e chess 為記錄集名...

J2ME刪除RMS中的記錄

1 什麼是永續性儲存?永續性儲存簡單的理解就是資料不因為程式的退出而丟失,一般我們在程式中宣告的變數都是儲存在stack或者heap上的,程式退出後這些資料會被清除以釋放資源。而儲存在rms中的資料是不會被清除的。2 rms的資料儲存在 midp規範中沒有規定rms的資料必須儲存在 而是由廠商來具體...

程式設計Week2作業題B 倒水問題

題意 給你兩個容器,容量分別為a,b 問是否能夠經過有限的步驟倒水,得到容量為 c 的水。輸入 輸入包含多組資料。每組資料輸入 a,b,c 資料範圍 0 a b c b 1000 a和b互質。輸出 你的程式的輸出將由一系列的指令組成。這些輸出行將導致某乙個罐子 不指定是哪乙個罐子 正好包含c單位的水...