1 条题解
-
0
题意分析
本题的场景是一群学生出去旅行,大家约定平摊所有费用,但实际操作时是个人先行垫付某些项目的费用。旅行结束后,要根据每位学生的花费情况进行转账,让最终每个人的净花费相同(误差不超过 1 美分)。我们的任务是依据给定的花费清单,计算出为了实现费用均摊所需交换的最少金额。输入包含多个旅行的数据,每个旅行先给出学生人数 ,接着是 行,每行表示一个学生的花费金额,以单独的一行 作为结束标志。输出对于每个旅行,要以美元和美分的格式输出所需交换的最小总金额。
解题思路
- 读取输入:持续读取学生人数
n
,直到n
为 0 时停止。对于每个非零的n
,读取n
个学生的花费金额。 - 计算总花费和平均花费:把所有学生的花费相加得到总花费
sum
,然后计算平均花费ave
。在计算平均花费时,要将结果精确到美分(保留两位小数)。 - 计算差值:遍历每个学生的花费,计算其与平均花费的差值。对于花费高于平均的学生,计算其超出的部分总和
ans1
;对于花费低于平均的学生,计算其不足的部分总和ans2
。 - 确定最小交换金额:由于要使交换金额最小,所以所需交换的最小总金额就是
ans1
和ans2
中的较小值。 - 输出结果:以美元和美分的格式输出所需交换的最小总金额。
示例代码解释
#include<stdio.h> int main() { int n,i; double a[1100],sum,ave; double ans1,ans2; // 循环读取输入,直到 n 为 0 while(scanf("%d",&n)!=EOF,n) { sum=0; // 读取每个学生的花费并计算总花费 for(i=0;i<n;i++) { scanf("%lf",&a[i]); sum+=a[i]; } // 计算平均花费并精确到美分 ave=((int)((sum/n+0.005)*100))/100.0; ans1=ans2=0; // 计算每个学生与平均花费的差值 for(i=0;i<n;i++) { if(a[i]>ave) ans1+=a[i]-ave; else ans2+=ave-a[i]; } // 输出所需交换的最小总金额 printf("$%.2lf\n",ans1>ans2? ans2:ans1); } return 0; }
注意事项
- 精度处理:在计算平均花费时,使用
((int)((sum/n+0.005)*100))/100.0
来确保结果精确到美分。 - 数组大小:数组
a
的大小为 1100,要保证其能容纳最多 1000 个学生的花费。 - 输入结束条件:输入以单独的一行
0
作为结束标志,在读取输入时要正确处理这个结束条件。 - 输出格式:输出结果要以美元和美分的格式,使用
$%.2lf
来确保输出格式正确。
- 读取输入:持续读取学生人数
- 1
信息
- ID
- 1646
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者