切換
舊版
前往
大廳
主題

ZeroJudge - d223: 10137 - The Trip 解題心得

Not In My Back Yard | 2019-09-21 23:11:48 | 巴幣 2 | 人氣 176

題目連結:


題目大意:
給定一正整數 n (n ≦ 1000,n = 0 時代表輸入結束),代表有 n 位學生。接著的 n 列,每列給定一個非負兩位小數的浮點數(不會超過 10, 000.00 ),依序代表各個學生在旅途中幫忙支出的金額。

因為有的人出的多、有的人少,因此需要盡可能地平衡各同學的支出(付比較少的要給錢給付比較多的)。如果無法完全平衡金額(不能都支出相同金額),則最多只允許差 0.01 (平衡後,最多與最少的差距)

求最少需要交換多少金額(少的人給多的人錢),才能平衡各同學的支出。



範例輸入:
3
10.00
20.00
30.00
4
15.00
15.01
3.00
3.01
5
5000.00
11.11
11.11
11.11
11.11
0


範例輸出:
$10.00
$11.99
$3991.11


解題思維:
首先因為要避免浮點數誤差的問題,因此我們需要將輸入的數值 × 100 後當整數處理。

接著我們可以看到,當金額總和 S (乘以 100 後再加總)不是人數 n 的倍數時,最後的平衡金額一定會有人需要多付 1 (原本的 0.01 × 100 後)的錢。

而我們可以藉此得知需要多付 1 的人數即是 S 除以 n 的餘數 r 。而 S 除以 n 的商數 q 是每個人應付的金額。

因為要最小化交換金額,因此令那些本來就付最多的 r 個人最後也多支付 1 的錢(因為付較多的人之金額較為接近「q + 1」的金額)。剩下的人都支付 q 的金額。

最後把所有人的「原本金額 - 最後金額」的值加總(不用判斷誰是多付、誰少付,全部都求差值並加總)除以 200 後即是所求。(除以 100 ,因為要把原本的調整調回來;再多除 2 是因為有多算了一次交換的金額(少給多,只算一次不算做兩次))

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作