Saturday, November 15, 2014

UVa 10554 - Calories from Fat

Accepted date: 2014-11-15
Ranking (as of 2014-11-15): 109 out of 525
Language: C++

/*
  UVa 10554 - Calories from Fat

  To build using Visual Studio 2012:
    cl -EHsc -O2 UVa_10554_Calories_from_Fat.cpp
*/

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
using namespace std;

int main()
{
  const int nr_nutritions = 5;
  const int calories_per_g[nr_nutritions] = {9, 4, 4, 4, 7};

  while (true) {
    string s;
    getline(cin, s);
    if (s[0] == '-')
      break;
    double fat = 0.0, total = 0.0, calories[nr_nutritions];
    while (true) {
      istringstream iss(s);
      double p = 100.0, c = 0.0;
      for (int i = 0; i < nr_nutritions; i++) {
        int q;
        char u;
        iss >> q >> u;
        switch (u) {
        case 'g':
          calories[i] = q * calories_per_g[i];
          c += calories[i];
          break;
        case 'C':
          calories[i] = q;
          c += q;
          break;
        case '%':
          calories[i] = -q;
          p -= q;
          break;
        }
      }
      double t = 0.0;
      if (p < 100.0) { // some are represented by %
        t = 100.0 * c / p; // total calories
        for (int i = 0; i < nr_nutritions; i++) {
          if (calories[i] < 0.0)
            calories[i] = t * (-calories[i]) /100.0;
#ifdef DEBUG
          cout << calories[i] << ' ';
#endif
        }
#ifdef DEBUG
        cout << t << endl;
#endif
      }
      else {
        for (int i = 0; i < nr_nutritions; i++) {
#ifdef DEBUG
          cout << calories[i] << ' ';
#endif
          t += calories[i];
        }
#ifdef DEBUG
        cout << t << endl;
#endif
      }
      fat += calories[0];
      total += t;
      getline(cin, s);
      if (s[0] == '-')
        break;
    }
    cout << fixed << setprecision(0) << fat * 100.0 / total << "%\n";
  }
  return 0;
}

No comments:

Post a Comment