UVa 10137 - The Trip

来源:互联网 发布:童谣的知乎回答 编辑:程序博客网 时间:2024/04/28 13:38

题目:组织同学去旅行,然后先分别付账,最后均摊,问需要交换的最少金钱数。

分析:简单题。本题由于最少交换单位为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;}