【秋招机试真题】hw-顺序执行的任务执行时间计算

/*
*    题目描述:
*        给定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记录当前任务的完成数

      【秋招机试真题】hw-顺序执行的任务执行时间计算

 


代码如下:

#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:

【秋招机试真题】hw-顺序执行的任务执行时间计算

 示例2:

【秋招机试真题】hw-顺序执行的任务执行时间计算

 

上一篇:2021-10-04 从上到下打印二叉树 III


下一篇:恒玄BES调试笔记-BES2500 如何修改hw timer