UVa——110103 The Trip

本文介绍了一种解决特定类型问题的方法,通过将学生按垫付费用与平均费用的比较分成两组,来计算最少的总交易金额。利用C++实现了算法,并详细解释了计算过程及关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路:刚开始读不懂题意,不知道到底让求什么,看着测试数据也很奇怪。根据题意,目的要求是“多退少补”,那么可以把学生分成两组,一组是垫付的费用大于平均费用的,一组是小于等于平均费用的,垫付多的学生应该退还钱款,垫付少的应该收取费用。而所求的是需要最少的那部分。即让求每个学生平摊支出所需的最小总“交易”金额。首先计算“平均费用”,由于要求支出差距在1分钱以内,故可以考虑在计算时取小数点后两位,对于第三位以后的数采用四舍五入的方法。可以截取浮点数中的部分小数位:sprintf( tmp, "%.2lf", ave);  sscanf( tmp, "%lf", &ave); 其中 ave 中为要操作的浮点数,而 tmp 为一字符数组。

ExpandedBlockStart.gifView Code
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 #define MAX 1005
 5 double a[MAX];
 6 char tmp[MAX];//用于截取小数点后前两位时用
 7 
 8 int main()
 9 {
10     int i,n;
11     while(cin>>n&&n)
12     {
13         double ave,sum=0.0;
14         for(i=0;i<n;i++)
15         {
16             cin>>a[i];
17             sum+=a[i];
18         }
19         ave=sum/n;
20         //截取浮点数 ave 中两位小数位
21         sprintf(tmp,"%.2lf",ave);
22            sscanf(tmp,"%lf",&ave);
23         double t=0.0,k=0.0;
24         for(i=0;i<n;i++)
25             if(a[i]>ave) t+=(a[i]-ave);//多退
26             else k+=(ave-a[i]);//少补
27         if(k>t) printf("$%.2lf\n",t);
28         else printf("$%.2lf\n",k);
29     }
30     return 0;
31 }

 

 

转载于:https://www.cnblogs.com/yueshuqiao/archive/2012/03/14/2395365.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值