frostblooded

Untitled

Oct 18th, 2017
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #define CONTESTANTS_COUNT 3
  4. #define MAX_CONTESTANT_HITS 5
  5. #define SECONDS_IN_MINUTE 60
  6. #define SECONDS_PENALTY 30
  7. #define STARTING_CONTESTANT_LETTER 'A'
  8.  
  9. using namespace std;
  10.  
  11. class Time {
  12. public:
  13.     unsigned long long minutes;
  14.     int seconds;
  15.  
  16.     Time(unsigned long long minutes, int seconds)
  17.     : minutes(minutes), seconds(seconds) {}
  18.  
  19.     void addSeconds(int value) {
  20.         seconds += value;
  21.  
  22.         while(seconds >= SECONDS_IN_MINUTE) {
  23.             seconds -= SECONDS_IN_MINUTE;
  24.             minutes++;
  25.         }
  26.     }
  27.  
  28.     int to_seconds() const {
  29.         return seconds + minutes * SECONDS_IN_MINUTE;
  30.     }
  31.  
  32.     bool operator<(const Time& time) const {
  33.         return this->to_seconds() < time.to_seconds();
  34.     }
  35.  
  36.     string to_string() {
  37.         return minutes + " " + seconds;
  38.     }
  39. };
  40.  
  41.  
  42. class Contestant {
  43. public:
  44.     int id;
  45.     Time time;
  46.     int hits;
  47.     bool normalized;
  48.  
  49.     Contestant(int id, unsigned long long minutes, int seconds, int hits)
  50.     : id(id), time(minutes, seconds), hits(hits), normalized(false) {}
  51.  
  52.     static Contestant* readFromCin(int id) {
  53.         unsigned long long m;
  54.         int s, i;
  55.         cin >> m >> s >> i;
  56.         return new Contestant(id, m, s, i);
  57.     }
  58.  
  59.     void normalize() {
  60.         if(normalized)
  61.             return;
  62.  
  63.         for(int i = hits; i < MAX_CONTESTANT_HITS; i++) {
  64.             hits++;
  65.             time.addSeconds(SECONDS_PENALTY);
  66.         }
  67.     }
  68.  
  69.     char get_letter() {
  70.         return STARTING_CONTESTANT_LETTER + id;
  71.     }
  72. };
  73.  
  74. Contestant* get_winner(Contestant* contestants[CONTESTANTS_COUNT]) {
  75.     Contestant* winner = contestants[0];
  76.     winner->normalize();
  77.  
  78.     for(int i = 1; i < CONTESTANTS_COUNT; i++) {
  79.         contestants[i]->normalize();
  80.  
  81.         if(contestants[i]->time < winner->time) {
  82.             winner = contestants[i];
  83.         }
  84.     }
  85.  
  86.     return winner;
  87. }
  88.  
  89. int main() {
  90.     Contestant* contestants[CONTESTANTS_COUNT];
  91.  
  92.     for(int i = 0; i < CONTESTANTS_COUNT; i++) {
  93.         contestants[i] = Contestant::readFromCin(i);
  94.     }
  95.  
  96.     Contestant* winner = get_winner(contestants);
  97.     cout << winner->time.minutes << " " << winner->time.seconds << " "
  98.          << winner->get_letter() << endl;
  99.  
  100.     for(int i = 0; i < CONTESTANTS_COUNT; i++) {
  101.         delete contestants[i];
  102.     }
  103.  
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment