杭電OJ 1210 Eddy s 洗牌問題

2021-08-27 09:18:53 字數 901 閱讀 8203

problem description

input

每行乙個整數n

output

輸出與之對應的m

sample input

20 1  

sample output

20 2  

author

eddy

source

杭電acm省賽集訓隊選拔賽之熱身賽

recommend

eddy

關於這道題的做法,我這裡複製一下杭電的解題報告:

eddy's洗牌

原始演算法:

我們把每個數逛來逛去最後又回家的過程叫做乙個迴圈,迴圈中經過的位置個數叫做迴圈的長度。如n=4時,有 兩個迴圈:1-2-4-8-7-5-1,長度為6;3-6-3,長度為2。答案就是所有迴圈長度的最小公倍數。顯然演算法時空複雜度均為o(n)(因為需要記錄乙個數是否已被某個迴圈經過)。

高效演算法:

1所在的迴圈長度就是答案。時間複雜度小於o(n),空間複雜度為o(1),程式設計複雜度也遠低於原始演算法。這個演算法是建立在如下結論之上的:「1所在的迴圈長度是其它任一迴圈長度的倍數」,或者表述為「1回家時,其它任一數字也一定回了家」。

給出的證明:

題目中的移動規則,其實就是每次把在第x個位置的數移動到位置x*2 mod (2*n+1)。這個式子是十分巧妙的,請用心領悟。由這個式子可以得出任一數字x在p步之後的位置:x*2^p mod (2*n+1)。假設1經過p步回了家,那麼可得1*2^p mod (2*n+1)=1。由此可得對任一數字x,均有x*2^p mod (2*n+1)=x,即1回家時任一數字都回了家。

發**:

#includeusing namespace std;

int main()

cout<

杭電OJ 1210 Eddy s 洗牌問題

eddy s 洗牌問題 problem description eddy是個acmer,他不僅喜歡做acm題,而且對於紙牌也有一定的研究,他在無聊時研究發現,如果他有2n張牌,編號為1,2,3.n,n 1,2n。這也是最初的牌的順序。通過一次洗牌可以把牌的序列變為n 1,1,n 2,2,n 3,3,...

HDOJ 1210 Eddy s 洗牌問題

上來大家的第一反應都是去找規律,想著去找通解,但是如果打表的話會發現並沒有什麼特別明確的通解,所以方向都錯了,其實這道題對書寫方式也是乙個誤導,我們看著n 1,1,n 2,2 2n,n,這組資料心裡面想的往往都是把前面n個數插入到後面n個數裡面,這樣想當然沒問題,但是就看不出這其實是一種置換,其實我...

飯卡 杭電oj

解題思路就是沒有5元的直接輸出 大於5元的要用5元貪心價值最大的 減去5元後的錢要最優即動態規劃中的01揹包 include include include using namespace std int c 1005 1005 int max int a,int b int main m1 m m...