最近华为笔试题(9.8)第三题

3 篇文章 0 订阅

前言:我没有参加这几场机考,感兴趣做了一下,有兴趣的同学参考参考
第三题(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
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值