最近华为笔试题(9.8)第三题
前言:我没有参加这几场机考,感兴趣做了一下,有兴趣的同学参考参考第三题(300分)最短编译时间题目描述:A公司需要在项目中引入某开源工程,需要评估该开源工程中某模块的编译时间。当前已知该项目中每个模块的编译时间以及其依赖的模块列表,在拥有无限数量的并行任务的情况下,求某个指定模块的最短编译时间。若模块间存在循环依赖或者依赖的模块不存在,则无法完成编译,返回-1。输入描述:第一行输入为目标模块名,以
前言:我没有参加这几场机考,感兴趣做了一下,有兴趣的同学参考参考
第三题(300分)最短编译时间
题目描述:
A公司需要在项目中引入某开源工程,需要评估该开源工程中某模块的编译时间。当前已知该项目中每个模块的编译时间以及其依赖的模块列表,在拥有无限数量的并行任务的情况下,求某个指定模块的最短编译时间。
若模块间存在循环依赖或者依赖的模块不存在,则无法完成编译,返回-1。
输入描述:
第一行输入为目标模块名,以后每行输入定义一个模块,包含模块的名字,编译时间,依赖模块列表,用逗号隔开,若依赖模块列表不存在,则表示可以独立编译,例如:
module2,10,module1
module1,10
模块名只包含字母和数字且至少包含一个字符
模块数量不超过50000个
输出描述:
输出最短编译时间,若无法完成编译则输出-1
示例1:
module3
module1,10
module2,5
module3,10,module1,module2
输出:20
说明:module1编译需要10ms,module2编译需要5ms,module3编译依赖module1,和module2,同时自身编译也需要10ms,所以总的编译时间为10+max(10,5) = 20ms
示例2:
module2
module2,10,module1
输出:-1
说明:module1没有定义,无法完成编译,所以输出-1
参考代码:
//9.8号华为第3题
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <queue>
using namespace std;
struct node {
string key;
int value;
vector<node>* from = nullptr;
node(string k, int v) :key(k), value(v)
{
from = new vector<node>();
}
bool operator < (const node& a)const
{
return key < a.key;
}
};
int main()
{
map<string, node> hstable; //图
string target;
cin >> target;
string line;
vector<vector<string>> vec;
vec.clear();
while (getline(cin,line))
{
string temp;
if (line == "")continue;
if (line == "e")break; //退出,自己的测试例子,无法跳出这个循环,会循环等待输入
stringstream ss(line);
vector<string> s_temp;
while (getline(ss, temp, ','))
{
s_temp.emplace_back(temp);
}
vec.emplace_back(s_temp);
} //完成所有的数据录入
cout << vec.size() << endl;
for (int i = 0; i < vec.size(); i++) //先吧点
{
if (hstable.find(vec[i][0]) == hstable.end()) //如果没有就添加一个新的进去
{
hstable.emplace(vec[i][0], node(vec[i][0], atoi(&vec[i][1][0])));
}
}
for (int i = 0; i < vec.size(); i++)
{
if (vec[i].size() != 2) //完成依赖关系的建立
{
for (int j = 2; j < vec[i].size(); j++)
{
if (hstable.find(vec[i][j]) == hstable.end()) //未定义,无法完成编译
{
cout << -1 << endl;
return 0;
}
hstable.find(vec[i][0])->second.from->emplace_back(hstable.find(vec[i][j])->second);
}
}
}
set<node> finish;
int ans = 0;
queue<node> myqueue;
myqueue.push(hstable.find(target)->second); //目标点
finish.emplace(hstable.find(target)->second);
while (!myqueue.empty())
{
int len = myqueue.size();
int temp_max = 0;
for (int i = 0; i < len; i++)
{
node temp = myqueue.front();
myqueue.pop();
temp_max = max(temp_max, temp.value); //保留每一层的最大值
for (auto i : *temp.from)
{
if (finish.find(i) != finish.end()) //依赖之前的点,说明存在环
{
cout << -1 << endl;
return 0;
}
finish.emplace(i); //完成使命的点
myqueue.push(i);
}
}
ans += temp_max;
}
cout << ans << endl;
return 0;
}
小结:图的bfs,确定环这里,考虑了很多种例子,后面权衡之后还是用一个哈希表存遍历过的点结构,而用拓扑排序的那种做法(应该可能有其他的点的边,依赖进去),在几种特殊的例子下,是过不了的。这里我的做法也是做了一个反向,从目标点反推,舍去不要的点。
问题:
1.map<sting,node> hstable;我使用hstable[“xxx”]表示一个node数据结构,ide报错,而使用hstable.find(“xxx”)->second就没有问题。有人知道这个是什么问题,请留言评论。
2.我的代码是vs下运行的,所以在输入处理那一块还是有点和考试的不一样。调用getline(cin,line)时会发现在vec的第一个位置会压入一个空的vector< string >,这个可能和我环境关系,我在运行这个循环之前,cin了一次,这个会导致问题的出现。
更多推荐
所有评论(0)