此题涉及浮点数运算,所以要格外小心。
题目大意是要求出最小的匀钱方案,精确到分。因此,求出平均数后,用多的减平均数得到的值,和用平均数减少的得到的值可能会有不同。取其中较小的就可以了。
特殊情况在于算出的较小的值可能是0,那么就得用较大的值了。
更新:之前对于用C++输出定长浮点数格式控制记不太清了,研究了一下做了修改,现在的科学一些了:
cout<< '$'<< setprecision(2)<< fixed<< result<< "/n";
返回 Volume CI 索引
返回总索引
// // 10137 - The Trip // Copyright (c) 2010 by Bo-wen Feng // balonfan@gmail.com // #include <set> #include <map> #include <list> #include <queue> #include <stack> #include <vector> #include <string> #include <sstream> #include <cstdio> #include <cmath> #include <limits> #include <utility> #include <iomanip> #ifndef ONLINE_JUDGE #include <fstream> std::ifstream cin("in.txt"); std::ofstream cout("out.txt"); // std::ofstream cout(stdout); #else #include <iostream> #endif typedef long long llong; typedef unsigned long long ullong; typedef long double ldouble; using namespace std; #define MAX 10001 int pay[MAX]; int main(int argc, char* argv[]) { int n; char c; int iPart, fPart; int total; int average; int chargeLarger; int chargeSmaller; cin>> n; while(n != 0) { total = 0; average = 0; chargeLarger = 0; chargeSmaller = 0; for(int i = 0; i < n; ++i) { cin>> iPart>> c>> fPart; pay[i] = iPart * 100 + fPart; total += pay[i]; } average = int(double(total) / n + 0.5); // Here is the key!!!!! for(int i = 0; i < n; ++i) { if(pay[i] > average) chargeLarger += (pay[i] - average); else chargeSmaller += (average - pay[i]); } int large = max(chargeLarger, chargeSmaller); int small = min(chargeLarger, chargeSmaller); double result = (small == 0 ? large : small) / 100.0; cout<< '$'<< setprecision(2)<< fixed<< result<< "/n"; cin>> n; } return 0; }