1 条题解

  • 0
    @ 2025-5-8 18:08:04

    题意分析

    本题的场景是一群学生出去旅行,大家约定平摊所有费用,但实际操作时是个人先行垫付某些项目的费用。旅行结束后,要根据每位学生的花费情况进行转账,让最终每个人的净花费相同(误差不超过 1 美分)。我们的任务是依据给定的花费清单,计算出为了实现费用均摊所需交换的最少金额。输入包含多个旅行的数据,每个旅行先给出学生人数 nn,接着是 nn 行,每行表示一个学生的花费金额,以单独的一行 00 作为结束标志。输出对于每个旅行,要以美元和美分的格式输出所需交换的最小总金额。

    解题思路

    1. 读取输入:持续读取学生人数 n,直到 n 为 0 时停止。对于每个非零的 n,读取 n 个学生的花费金额。
    2. 计算总花费和平均花费:把所有学生的花费相加得到总花费 sum,然后计算平均花费 ave。在计算平均花费时,要将结果精确到美分(保留两位小数)。
    3. 计算差值:遍历每个学生的花费,计算其与平均花费的差值。对于花费高于平均的学生,计算其超出的部分总和 ans1;对于花费低于平均的学生,计算其不足的部分总和 ans2
    4. 确定最小交换金额:由于要使交换金额最小,所以所需交换的最小总金额就是 ans1ans2 中的较小值。
    5. 输出结果:以美元和美分的格式输出所需交换的最小总金额。

    示例代码解释

    #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;
    }
    

    注意事项

    1. 精度处理:在计算平均花费时,使用 ((int)((sum/n+0.005)*100))/100.0 来确保结果精确到美分。
    2. 数组大小:数组 a 的大小为 1100,要保证其能容纳最多 1000 个学生的花费。
    3. 输入结束条件:输入以单独的一行 0 作为结束标志,在读取输入时要正确处理这个结束条件。
    4. 输出格式:输出结果要以美元和美分的格式,使用 $%.2lf 来确保输出格式正确。
    • 1

    信息

    ID
    1646
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者