工作时间片问题

问题描述:
输入: 客户名: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值