110406 CDVII

来源:互联网 发布:数控铣削编程 编辑:程序博客网 时间:2024/05/24 03:34


#include <stdio.h>#include <iostream>#include <string>#include <string.h>#include <vector>#include <algorithm>#include <map>#include <stdlib.h>#include <sstream> #include <math.h> using namespace std;const int HOURS_IN_DAY = 24;const int MINUTE_IN_HOUR = 60;const int PASS_FEE = 100;const int MONTH_FEE = 200;class CarInfo;typedef CarInfo* CarInfoPtr;class CarInfo{private:class PassInfo{public:class PassInfoComparer{public:bool operator()(const PassInfo& a, const PassInfo& b){return (b.m_time >= a.m_time);}};int m_time;int m_distance;bool m_isEnter;};public:CarInfo(const string& carNo) : m_carNo(carNo) {}class CarInfoComparer{public:bool operator()(const CarInfoPtr& a, const CarInfoPtr& b){return (strcmp(b->m_carNo.c_str(), a->m_carNo.c_str()) >= 0);}};void AddPassInfo(int day, int hour, int minute, int distance, bool isEnter){PassInfo passInfo;passInfo.m_distance = distance;passInfo.m_time = day * HOURS_IN_DAY * MINUTE_IN_HOUR + hour * MINUTE_IN_HOUR + minute;passInfo.m_isEnter = isEnter;m_passInfos.push_back(passInfo);}int GetTotalCost(int* priceList){if (m_passInfos.size() <= 0)return 0;sort(m_passInfos.begin(), m_passInfos.end(), PassInfo::PassInfoComparer());int size = m_passInfos.size();if (size <= 0)return 0;int totalSum = 0;int i = 0;bool foundValidPair = false;while(true){while((i < size) && (!(m_passInfos[i].m_isEnter)))++i;if (i == size)break;++i;while((i < size) && (m_passInfos[i].m_isEnter))++i;if ((i == size) || (i == 0))break;int priceIndex = (m_passInfos[i - 1].m_time % (HOURS_IN_DAY * MINUTE_IN_HOUR)) / MINUTE_IN_HOUR;totalSum += abs(m_passInfos[i].m_distance - m_passInfos[i - 1].m_distance) * priceList[priceIndex] + PASS_FEE;++i;}if (totalSum > 0)totalSum += MONTH_FEE;return totalSum;}void OutputInfo(int* priceList){int totalCost = GetTotalCost(priceList);  if (!totalCost)return;cout.precision(2);  cout.setf(ios::fixed | ios::showpoint);  cout << m_carNo << " $" << (totalCost / 100.00) << endl;}private:string m_carNo;vector<PassInfo> m_passInfos;};static void GetTimeFromLine(const string& timeStr, int& day, int& hour, int& minute){// line: mm:dd:hh:mmchar* line = const_cast<char*>(timeStr.c_str());line += 3;line[2] = '\0';day = atoi(line);line += 3;line[2] = '\0';hour = atoi(line);line += 3;line[2] = '\0';minute = atoi(line);}static void AddPassInfoFromLine(char* line, vector<CarInfoPtr>& carInfos, map<string, int>& carNameToIndexMap){    istringstream iss(line);  string carNo;iss >> carNo;int index;map<string, int>::iterator iter = carNameToIndexMap.find(carNo);if (iter != carNameToIndexMap.end())index = iter->second;else{CarInfo* pNewCarInfo = new CarInfo(carNo);carInfos.push_back(pNewCarInfo);index = carInfos.size() - 1;carNameToIndexMap.insert(pair<string, int>(carNo, index));}string timeStr;iss >> timeStr;int day, hour, minute;GetTimeFromLine(timeStr.c_str(), day, hour, minute);string enterOrExit;iss >> enterOrExit;bool isEnter = false;if (enterOrExit[1] == 'n'){isEnter = true;}else if (enterOrExit[1] != 'x')return;int distance;iss >> distance;carInfos[index]->AddPassInfo(day, hour, minute, distance, isEnter);}static void OutputInfo(vector<CarInfoPtr>& carInfos, int* priceList){sort(carInfos.begin(), carInfos.end(), CarInfo::CarInfoComparer());vector<CarInfoPtr>::iterator iter = carInfos.begin();while(iter != carInfos.end()){(*iter)->OutputInfo(priceList);++iter;}}const int MAX_BUF = 4096;static char s_buf[MAX_BUF];static int s_priceList[HOURS_IN_DAY];static void RunTestCase(){for (int i = 0; i < HOURS_IN_DAY; ++i){cin >> s_priceList[i];}fgets(s_buf, MAX_BUF, stdin); // Consume the '\n' after the price list.vector<CarInfoPtr> carInfos;map<string, int> carNameToIndexMap;while(true){if ((!fgets(s_buf, MAX_BUF, stdin)) || (s_buf[0] == '\0') || (s_buf[0] == '\n'))break;AddPassInfoFromLine(s_buf, carInfos, carNameToIndexMap);}OutputInfo(carInfos, s_priceList);int cnt = carInfos.size();for (int i = 0; i < cnt; ++i)delete carInfos[i];}static void Test(){int cnt;cin >> cnt;fgets(s_buf, MAX_BUF, stdin); // Consume the '\n' after the test case count.fgets(s_buf, MAX_BUF, stdin); // Consume the new line after the test case count.for (int i = 0; i < cnt; ++i){if (i != 0)cout << endl;RunTestCase();}}int main(int argc, char* argv[]){Test();return 0;}


原创粉丝点击