巧用進製解決天平稱問題《演算法很美》

2021-10-14 09:35:26 字數 1479 閱讀 3017

用天平稱重時,我們希望佣金可能少的砝碼組合稱出盡可能多的重量。

如果有無限個砝碼,但它們的重量分別是1,3,9,27,81,…等3的指數冪神奇之處在於用它們的組合可以稱出任意整數重量(砝碼允許放在左右兩個盤中)。

本題目要求程式設計實現:對使用者給定的重量,給出砝碼組合方案,重量<1000000。

例如:使用者輸入:

程式輸出

9-3-1

思路:

輸入了5對吧,將5變成3進製則為 「12」,然後將"12",進一位則為"2-1",還不能表示,那麼再進一位為"1-1-1",則(13^2)(-13)(-11*3 ^ 0) = 9-3-1

具體思路:

final string x = integer.tostring(n,3);轉稱3進製

char arr = new stringbuilder(x).reverse().tostring().tochararray();放入stringbuider(x)進行翻轉再轉成字串再轉成字元陣列。

listlist = new arraylist<>();建立乙個list容器處理0,-1,1

遍歷arr陣列

這裡就要注意了,經典你要把這抽象起來,其實無法就是用了if if-else else去做判斷,判斷3進製裡面的3鐘數,2、3、1或者0這是外界

每判斷2、3外界數,就插入相應的數,並判斷是否是最後乙個數,如果是則插入其對應數,不是的話就進一位。

其他數就直接插入

暴力法思路:

先定義好s=//用做改變是減號還是加號還是0的作用

然後for遍歷a、b、c、d、e 用作改變1,3,9,27,81正負0的下標

建立乙個stringbuilder,判斷正負將1,3,9,27,81帶符號的放進去

記住還要除去第乙個字元的正負號

public

class 巧用進製解決天平稱重問題

else

}else

if(arr[i]

=='3'

)else

}else

}stringbuilder sb =

newstringbuilder()

;for

(int i =

0; i < list.

size()

; i++

) system.

out.

println

(sb.

substring(1

));}

private

static

voidm1(

int n)

;for

(int a =

0; a <

3; a++)}

}}}}

}}

天平稱球問題

筆試題目碰到了天平稱球的問題,之前遇到沒有細細的查閱資料,再次筆試的時候就吃虧了,這裡記錄下結論 現有n個小球,其中有乙個壞球不知比標準球輕還是重。我們令h 1 要保證在n個球中找出壞球並知道其輕重,至少需要稱h次。假設n 2,我們有 2 如果n 3h 1 2,那麼稱h次就足夠了 3 如果n 3h ...

天平稱小球問題

天平稱小球問題 天平稱小球問題有很多經典的正規化解法,在這裡我們談論著只是其中最為廣泛應用的一種 三進製編碼解法。為什麼想起了使用三進製?其實很好理解。讓我們考慮一下小球的狀態,有 沒放在天平上 在天平左盤 在天平右盤三種。我們不妨用一些數碼來表示這三種狀態 0 沒放在天平上 1 放在天平左盤 2 ...

天平稱球問題

筆試題目碰到了天平稱球的問題,之前遇到沒有細細的查閱資料,再次筆試的時候就吃虧了,這裡記錄下結論 現有n個小球,其中有乙個壞球不知比標準球輕還是重。我們令h 1 要保證在n個球中找出壞球並知道其輕重,至少需要稱h次。假設n 2,我們有 2 如果n 3h 1 2,那麼稱h次就足夠了 3 如果n 3h ...