/*
* 题目描述:
* 给定N个任务(1<=N<=100),任务编号从0开始顺序累加,这N个任务在系统中排队顺序执行,每个任务的自身执行时间
* 为非负数,依次为t1,t2,...tn,部分任务之间存在依赖关系的,某任务所依赖的任务如果没有执行,则该任务需要重回队尾
* 重新排队。只有任务执行以及任务排队等待会消耗时间,具余操作消耗时间忽略不计。请计算每个任务的实际执行时间(实际
执行时间=任务自身执行的时间+在队列中等待其他任务执行的时间)
输入描述:
第一行输入按照任务编号递增的顺序表示N个任务的自身执行时间,为逗号分隔的字符串,执行时间取值范围[1, 999],
例如:1,3,4(逗号前后没有空格),表示一共3个任务,每个任务的自身执行时间分别为1,3,4。
第二行输入表示任务之间的依赖关系,为逗号分隔的字符串,每个依赖关系都表明了两个任务编号之间的依赖关系,
例如:0->2(逗号前后没有空格),表示有一个依赖关系,编号为0号任务的执行,依赖于编号为2号任务的执行,注意一个
任务可以依赖多个任务的执行,在这种情况下, 需要其依赖的任务全部执行完成,才能执行此任务
输入保证合法,不需要考虑中间存在空格等异常输入场景,且任务之间不考虑循环依赖的场景
输出描述:
按照任务编号递增的顺序,输出每个任务的实际执行时间,以逗号分隔,逗号前后不要空格,例如:8,3,7
示例1:
输入:
1,3,4
0->2
输出:
8,3,7
示例2:
输入:
1,3,4,5,8,5,3,6
0->2,2->4,2->6
输出:
35,3,24,8,16,21,24,30
*/
说明:
华为0407第二题真题,
解题思路:
1、输入处理:按任务编号记录每个任务需要的时间,记录每个任务所依赖的任务列表;
2、然后循环顺序执行每个任务,模拟任务执行的过程,使用两个关键变量记录,last_time记录上一个任务结束时间,count记录当前任务的完成数
代码如下:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<int> solution(vector<vector<int>>& depends, vector<int>& time) {
// 任务个数
int n = time.size();
// 已完成的任务计数
int count = 0;
// 记录上一个任务完成的时间
int last_time = 0;
// 记录任务是否完成
vector<bool> isComplete(n, false);
// 记录每个任务完成的时间
vector<int> res(n);
//
while (count < n) {
for (int i = 0; i < n; ++i) {
// 初始化 是否可以执行该任务
//如果任务已经全部完成,提前返回
if (count == n) break;
//如果这个任务已经完成了,就跳过
if (isComplete[i]) continue;
bool toExcute = true;
for (int dependTask:depends[i]) {
// 判断该任务依赖的任务是否都已经完成,如果都完成,就可以执行该任务
// 如果有依赖的任务没完成,就不能执行该任务
if (!isComplete[dependTask]) toExcute = false;
}
if (toExcute) {
last_time += time[i];
res[i] = last_time;
isComplete[i] = true;
++count;
}
}
}
return res;
}
vector<string> splitToString(string& s, string c) {
vector<string> res;
int left = 0;
int idx;
int size = c.size();
string tmp;
while (s.find(c, left) != s.npos) {
idx = s.find(c, left);
tmp = s.substr(left, idx - left);
left = idx + size;
res.push_back(tmp);
}
tmp = s.substr(left, s.size() - left);
res.push_back(tmp);
return res;
}
vector<int> splitToNum(string& s, string c) {
vector<string> stringVector = splitToString(s, c);
vector<int> res(stringVector.size());
for (int i = 0; i < res.size(); ++i) {
res[i] = atoi(stringVector[i].c_str());
}
return res;
}
/*
vector<int> calculateTaskCost(vector<int>& task_time, vector<vector<int>>& graph) {
vector<int> res(task_time.size());
}
*/
string printString(vector<int>& time) {
string res;
for (int i = 0; i < time.size(); ++i) {
res += to_string(time[i]);
res += ',';
}
res.erase(res.size() - 1);
return res;
}
int main() {
string time;
cin >> time;
vector<int> task_time = splitToNum(time, ",");
string s;
cin >> s;
vector<string> pairs = splitToString(s, ",");
vector<vector<int>> depends(task_time.size());
for (string pair : pairs) {
vector<int> tasks = splitToNum(pair, "->");
depends[tasks[0]].push_back(tasks[1]);
}
vector<int> res = solution(depends, task_time);
string prints = printString(res);
cout << prints << endl;
}
执行结果如图:
示例1:
示例2: