倒水(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單位的水...