题目:组织同学去旅行,然后先分别付账,最后均摊,问需要交换的最少金钱数。
分析:简单题。本题由于最少交换单位为0.01所以涉及到精度问题。平均数肯能超过这个精度。
首先,求得精度到0.01的平均数,所以最后所有人手中的金钱只能是平均数ave或者ave+0.01。
然后,进行比较,如果钱数超过ave+0.01的就先变成ave+0.01,这些事必须交换的。
最后,剩下的钱数是ave+0.01的人数应该是sum-ave*n,如果上面转化的人数超过,结果要加上。
(在把超过ave+0.01转化成ave+0.01的值时,可能产生新的ave+0.01,所以加之前要判断)
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
double stu[1005];
int main()
{
int n;
while ( ~scanf("%d",&n) && n ) {
double ave = 0.0,sum = 0.0;
for ( int i = 0 ; i < n ; ++ i ) {
scanf("%lf",&stu[i]);
sum += stu[i];
}
ave = sum/n;
ave = (int)(ave*100)/100.0;
//首先,把超过ave+0.01的转化成ave+0.01
double excha = 0.0;
int count = 0;
for ( int i = 0 ; i < n ; ++ i )
if ( stu[i] > ave+0.01 ) {
excha += stu[i]-ave-0.01;
count ++;
}
//把多余的ave+0.01加进结果;注意要先判断
if ( 0.01*count > sum-ave*n )
excha += 0.01*count-sum+ave*n;
printf("$%.2lf\n",excha);
}
return 0;
}