有一个旅行俱乐部每年都组织学生到不同的地方旅行,他们一开始就说好要平摊费用,但是每次花费都平摊死不现实的,因此每个学生先为某些特定的项目(例如吃饭、住酒店、打车等)垫付一些钱,当旅行结束时候根据每个学生垫付的金额多退少补,使得每个人的支出差距在一分钱以内,在过去,重新分配钱币是一件乏味且耗时的工作,你的任务就是根据一份清单算出为了平摊费用(差距在一分钱以内)所必须的最小总“交易”金额。
输入:
输入将包括若干组旅行的数据,每一组数据的第一行为一个整数n,代表这次旅行的学生人数,接下来的n行每一行包含了一个学生的支出,精确到分。学生人数不超过1000,并且每个学生的支出不超过100000美元,在最后一组数据结尾后还单独有一行,宝行了一个0。
输出:
对于每一组数据,只输出一行,即让每个学生平摊费用所需的最小总“交易”金额,以美元计,精确到分。
样例输入:
3
10.00
20.00
30.00
4
15.00
15.01
3.00
3.01
0
样例输出:
$10.00
输入:
输入将包括若干组旅行的数据,每一组数据的第一行为一个整数n,代表这次旅行的学生人数,接下来的n行每一行包含了一个学生的支出,精确到分。学生人数不超过1000,并且每个学生的支出不超过100000美元,在最后一组数据结尾后还单独有一行,宝行了一个0。
输出:
对于每一组数据,只输出一行,即让每个学生平摊费用所需的最小总“交易”金额,以美元计,精确到分。
样例输入:
3
10.00
20.00
30.00
4
15.00
15.01
3.00
3.01
0
样例输出:
$10.00
$11.99
题意不明,虽然代码运算结果正确,思路待补充。
代码:
#define N 1000
double minAmtMoney(double money[],int n)
{
double sum=0,s1=0,s2=0;
double avg=0,avg_floor,avg_ceil;
for(int i=0;i<n;i++)
{
scanf("%lf",&money[i]);
sum+=money[i];
}
avg=sum/n;
int tmp=(int)(avg*100);
avg_floor=avg_ceil=tmp/100;
// 平均值精度未知,首先要仅保留2位小数,通过乘100(2个0)取整实现
if(avg*100<(int)(avg*100))
avg_floor=tmp+0.01;
for(int i=0;i<n;i++)
{
if(money[i]>avg)
s1=s1+money[i]-avg_ceil;
else
s2=s2+avg_floor-money[i];
}
return s1<s2?s1:s2;
}