【FOJ】Problem 1364 The Trip(未解之谜)

Problem 1364 The Trip.

题意

  • 旅行的时候每个人分别花钱,旅行结束后看每个人的花费,各自补钱转账啥啥的,使得每个人花费一样,求成员之间转账到平均情况的最小转账总额。
  • 输入:
    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;
}
发布了46 篇原创文章 · 获赞 0 · 访问量 461

猜你喜欢

转载自blog.csdn.net/qq_44531167/article/details/105417268