Tuesday, December 19, 2006

Sharif ICPC Regionals 2006 - Problem C

   1:#include <string>
   2:#include <vector>
   3:#include <fstream>
   4:#include <iomanip>
   5:#include <iostream>
   6:#include <algorithm>
   7:
   8:using namespace std;
   9:
  10:#define PROB_NAME   "C"
  11:
  12:bool duringnight (int b, int e) // [b,e)
  13:{
  14:    b %= 24 * 60; e %= 24 * 60;
  15:    if (0 <= b && b < 6 * 60 + 1) return true;  // Rules are not clear about the length
  16:    if (0 < e && e <= 6 * 60 + 1) return true;  // of night. Is it 6 hours or 361 minutes?
  17:    return false;
  18:}
  19:
  20:int main ()
  21:{
  22:    ifstream fin (PROB_NAME ".in");
  23:    
  24:    while (0 == 0)
  25:    {
  26:        vector<string> name;
  27:        vector<int> length, minute;
  28:        
  29:        string foo;
  30:        while ((fin >> foo) && foo != "$" && foo != "--")
  31:        {
  32:            name.push_back (foo); length.push_back (-1); minute.push_back (-1);
  33:            fin >> length.back() >> minute.back();
  34:        }
  35:        if (foo == "--") break;
  36:        
  37:        string stname, enname;
  38:        int sth = -1, stm = -1;
  39:        char bar;
  40:        
  41:        fin >> stname >> enname >> sth >> bar >> stm;
  42:        fin >> foo;
  43:        
  44:        int st = int(find(name.begin(), name.end(), stname) - name.begin());
  45:        int en = int(find(name.begin(), name.end(), enname) - name.begin());
  46:        
  47:        int stt = (sth * 60 + stm) % (24 * 60);
  48:        int curt = stt;
  49:        int totallen = 0;
  50:        double fare = 0.0;
  51:        for (int i = st; i <= en; ++i)
  52:        {
  53:            for (int j = 0; j < length[i]; ++j)
  54:            {
  55:                bool night = duringnight (curt, curt + minute[i]);
  56:                double rate = (night ? 1.2 : 1.0);
  57:                
  58:                if (totallen < 10) fare += 1000 * rate;
  59:                else if (totallen < 30) fare += 250 * rate;
  60:                else fare += 100 * rate;
  61:                
  62:                totallen++;
  63:                curt += minute[i];
  64:            }
  65:        }
  66:        double avgkph = totallen / (60 * (curt - stt));
  67:        if (avgkph < 30) fare *= 1.1;
  68:        
  69:        cout << fare << endl;
  70:    }
  71:    return 0;
  72:}
  73:

No comments: