怎樣把十個數平均分為兩組,使得每組數值和之差最小?

時間 2021-05-11 22:49:04

1樓:章浩

假設,當前陣列a和陣列b的和之差為 A = sum(a) - sum(b)

a的第i個元素和b的第j個元素交換後,a和b的和之差為

A' = ( sum(a) - a[i] + b[j] ) -( sum(b)- b[j] + a[i] )

= sum(a) - sum(b) - 2 (a[i] - b[j])

= A - 2 (a[i] - b[j])

設x= a[i] - b[j] |A| - |A'| = |A| - |A-2x|

假設A> 0, 當x在(0,A)之間時,做這樣的交換才能使得交換後的a和b的和之差變小, x越接近A/2效果越好, 如果找不到在(0,A)之間的x,則當前的a和b就是答案。

所以,一種簡明的思路就是:

在a和b中尋找使得x在(0,A)之間並且最接近A/2的i和j,交換相應的i和j元素,重新計算A後,重複前面的步驟直至找不到(0,A)之間的x為止。

詳見我的部落格:求解|x-y|最小 - hzhang_NJU - 部落格園

2樓:安地

沒有必要。10個人列舉即可算出最優,人數多就直接隨機,也是可以接受的相近的。

在遊戲裡面,遊戲的匹配是找相近的玩家一起匹配,內戰的話只有隨機匹配陣營。

非要問演算法的話,我想到乙個,但做不到完全精確。

如果只有兩個的話,直接a:b;

如果四個人呢,戰鬥力為a>b>c>d,那匹配就是a+d:b+c;

再增加兩個人,e與f,那我們可以把戰鬥力高的加弱隊去,弱的加到強隊去;

然後依次進行。

如果增加的兩個人之前實力差比較大的話,可能結果偏離比較多,所以可以開始先排好序,依次排好,然後使用此法去分組。

3樓:

沒有最優演算法,實力分本來就是個「估值」,而且並不表示分數差10分(或者100分),實力就是線性差10分。有時候可能差10分就是碾壓(高分段),有時候差100分都差不多(低分段)

大多數匹配其實就是按實力分序排列後 ABBAABBABA錯開A壓B = 5 + 3 + 3 + 1 = 12B壓A = 4 +4 +2 + 2 +1 = 11A略微有優勢

假如人類手腳指趾天生是各八個而不是十個,數學將會發生哪些變化?

贊同 胡程喬的答案,即使進製的選擇跟手指有關,人們仍然會認為自己在用的是十進位制。只不過當八指星人看到有 5 5 個指頭的地球人時,會驚奇地發現地球人在用12進製。這對數學理論應該沒有任何影響。在應用領域,所有數表都會變小,比如說八指星的小學生就只需要背七七乘法表,生活會比地球小學生幸福那麼一點點。...

乙個程式取50000個隨機數和十個程式各取5000個隨機數效果一樣嗎?

先來解答一下你的困惑,包括為什麼 openMP 多執行緒 srand rand 出來的結果一樣。因為 rand 一般使用的是偽隨機演算法。大多數的偽隨機演算法的工作原理都是根據乙個種子值 由 srand 設定 根據一定規則初始化出乙個初始狀態。在每次獲取隨機值時,根據另一組規則更新狀態,並計算出返回...

python怎麼輸入乙個數然後把它的每個數倒過來輸出

寫乙個不用轉換成str的版本 from math import log10 ceil defreturn inverse num list x return x 10 i 10fori inrange 0 ceil log10 x 只要直接呼叫即可In 1 return inverse num li...