题意
- 旅行的时候每个人分别花钱,旅行结束后看每个人的花费,各自补钱转账啥啥的,使得每个人花费一样,求成员之间转账到平均情况的最小转账总额。
- 输入:
n个学生(不超过1000)
n行数据,表示每个学生花费的金额(不超过$10,000.00)
以0结束 - 输出:
最小转账总额
思路
- WA的思路
计算出每次旅行的平均金额,然后把花费超过平均额度的学生的花费和平均额度做差累加,即为需要转账的最小总额
① 为啥样例第二个算出来应该是12.00,可是样例输出却是11.99?
第二组样例平均额度9.005,因为只能用美金和美分交易,所以0.005应该是无法交易的,四舍五入取9.01后计算出来就是11.99
② 如果是3个人,3 3 4的分账呢?
4 - 3.33 = 0.67 - 看过别人的题解后
if (s[i] < sum)
resultL += (int)((sum - s[i])*100) / 100.0;
else
resultH += (int)((s[i] - sum)*100) / 100.0;
printf("$%0.2lf\n", resultL < resultH ? resultH : resultL);
分开计算(多付款的同学和平均值的差额之和)和(少付款的同学和平均值的差额之和),然后在这两个里面取大的那个。差额只取整的美分(小数点第三位及以后直接舍掉)
然而我并不知道他为什么这么做
回到上面的②,输出的是应该是0.66!!!
笔记
每组数据要初始化数组为0
一组数据中可能有不止一个符合条件的值
代码
#include<cstdio>
using namespace std;
int main(){
int n;
double expense[1010], avg, ans_L, ans_H;
while(scanf("%d", &n)!=EOF){
if(n==0)
break;
avg = 0;
for(int i=0; i<n; i++){
scanf("%lf", &expense[i]);
avg += expense[i];
}
avg /= n;
ans_L = 0;
ans_H = 0;
for(int i=0; i<n; i++){
if(expense[i]<avg) //低于平均的差额值 舍去小数点3位及以后(比实际差额值/要交的额度少)
ans_L += (int)((avg-expense[i])*100) / 100.0;
else //高于平均的差额值 舍去小数点3位及以后(比实际差额值/要补的额度小)
ans_H += (int)((expense[i]-avg)*100) / 100.0;
}
printf("$%.2f\n", ans_L < ans_H ? ans_H : ans_L);
//所以为什么是输出差额值里面大的那个???试着改成小的那个就WA了
}
return 0;
}