题目链接:http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=1016

Description
The Trip A group of students are members of a club that travels annually to different locations. Their destinations in the past have included Indianapolis, Phoenix, Nashville, Philadelphia, San Jose, and Atlanta. This spring they are planning a trip to Eindhoven. The group agrees in advance to share expenses equally, but it is not practical to share every expense as it occurs. Thus individuals in the group pay for particular things, such as meals, hotels, taxi rides, and plane tickets. After the trip, each student’s expenses are tallied and money is exchanged so that the net cost to each is the same, to within one cent. In the past, this money exchange has been tedious and time consuming. Your job is to compute, from a list of expenses, the minimum amount of money that must change hands in order to equalize (within one cent) all the students’ costs.

Input
Standard input will contain the information for several trips. Each trip consists of a line containing a positive integer n denoting the number of students on the trip. This is followed by n lines of input, each containing the amount spent by a student in dollars and cents. There are no more than 1000 students and no student spent more than $10,000.00. A single line containing 0 follows the information for the last trip.

Output
For each trip, output a line stating the total amount of money, in dollars and cents, that must be exchanged to equalize the students’ costs.

Sample Input
3
10.00
20.00
30.00
4
15.00
15.01
3.00
3.01
0

Sample Output
$10.00
$11.99

题目大意:有n个人去旅行,每个人都花费了一定的钱,现在要平摊,问你至少有多少钱在“交易”;

首先计算“平均费用”,即总费用除以学生人数得到的数值,由于是要求支付差距在 1 分钱以内,故可以考虑在计算时取小数点后两位,对于第三位以后的数采用四舍五入的方法,如计算平均值为 9.666666,则取 9.67;一开始用小数做时,出现了WA,后来发现转化成整数的话更加方便入手~~为了保证数据的精确性,最好还是用双精度做,单精度似乎会出错~

下面是我的代码:

code:

#include”stdio.h”

int main()
{
int n;
double s[1001],sum,avr,acc;
int i;
while(scanf(“%d”,&n)&&n)
{
sum=0,avr=0,acc=0;
for(i=0;i<n;i++)
{
scanf("%lf",&s[i]);
sum+=s[i];
}
sum=sum/(double)n;
sum=(int)(sum*100+0.5+0.0001)/100.0;
for(i=0;isum)
avr+=(s[i]-sum);
else
acc+=(sum-s[i]);
}
printf(“$%.2lf\n”,avr<acc?avr:acc);
}
return 0;
}
菜鸟之作,仅供参考,如有错误,请您指出。——Tamara

发表评论

电子邮件地址不会被公开。

Post Navigation