工作時間片問題

問題描述:
輸入: 客戶名:start/end:作業號(唯一):開始時間
輸出: 客戶名:佔用時間片個數 (按客戶名遵循先來先輸出)
代碼:

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <stack>

using namespace std;

int main()
{
    string tmp;
    vector<string> v;
    while (cin >> tmp) {
        v.push_back(tmp);
    }

    stack<string> s;
    unordered_map<string, int> um;
    vector<string> printClientName;

    string firstClientName;
    string firstStartTime;
    int firstStartTimeForInt;
    size_t firstIdx1 = v[0].find_first_of(':');
    firstClientName = v[0].substr(0, firstIdx1 - 0);
    size_t firstIdx2 = v[0].find_first_of(':', firstIdx1 + 1);
    size_t firstIdx3 = v[0].find_first_of(':', firstIdx2 + 1);
    firstStartTime = v[0].substr(firstIdx3 + 1);
    firstStartTimeForInt = stoi(firstStartTime);

    // init
    int lastInt = firstStartTimeForInt;
    um[firstClientName] = 0;
    printClientName.push_back(firstClientName);
    s.push(firstClientName);

    for (int i = 1; i < v.size(); i++) {
        string clientName;
        string statusStr;
        string startTime;
        int startTimeForInt;
        size_t idx1 = v[i].find_first_of(':');
        clientName = v[i].substr(0, idx1 - 0);
        size_t idx2 = v[i].find_first_of(':', idx1 + 1);
        statusStr = v[i].substr(idx1 + 1, (idx2 - 1) - (idx1 + 1) + 1);
        size_t idx3 = v[i].find_first_of(':', idx2 + 1);
        startTime = v[i].substr(idx3 + 1);
        startTimeForInt = stoi(startTime);
        //cout << clientName << " " << statusStr << " " << startTimeForInt << endl;
        if (um.find(clientName) == um.end()) {
            um[clientName] = 0;
            printClientName.push_back(clientName);
        }
        string firstClient = s.top();
        um[firstClient] += startTimeForInt - lastInt;
        lastInt = startTimeForInt;
        if (statusStr == "start") {
            s.push(clientName);
        } else {
            s.pop();
        }
    }

    for (auto i:printClientName) {
        cout << i << ':' << um[i] << endl;
    }
    return 0;
}

測試用例:

AA:start:0:0
BB:start:1:2
AA:start:2:4
AA:end:2:5
BB:end:1:6
AA:end:0:8

輸出:

AA:5
BB:3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章