2008年4月4日 星期五

Problem 10137 The Trip,旅遊分帳問題

這個旅遊分帳的問題雖然簡單,但是其中四捨五入的問題卻是非常重要。而問題所舉的第二個範例也能反映這個問題的核心。
這個問題說有一群學生出去遊玩,每個人先付一些集體需要的花費,例如車票、住宿、吃飯等,回來後大家再均攤。由於要算到「分」,就是小數的第二位,因此必須要處理四捨五入進位的問題。
我使用一個簡單的方法,就是讀進來的值乘100後再加總。再用C語言的floor來處理,程式如下
mean = floor(total/studNum+0.5)/100;

四捨五入進位後,所得的結果就會是這次旅遊每個人的平均花費。
因為一定會有一批人要再拿出一些錢,另一批人收回一些錢,題目問的是印出最小的交換金額,也就是在拿出來總額與收回去總額中取其小。重點程式碼如後:
for (i=0;i<studNum;i++)
{
if (expense[i]>mean)
pay1 += expense[i]-mean;
if (expense[i]<mean)
pay2 += mean-expense[i];
}
if (pay1<pay2)
printf("$%.2f\n", pay1);
else
printf("$%.2f\n", pay2);

這題非常適合C語言初學者練習解題用。
p10137 問題連結
ACM 題庫目錄
回到首頁

沒有留言: