华为七月份机试题总结4-0728

这些题目都是在牛客网上搜集的,也参考了一些大佬的代码。
对题目进行了详细的描述,并提供了输入输出示例,参考代码也更适合基础薄弱的参看。
希望大家可以一起交流学习,offer拿到手软!!!
/*
华为的机试题0728-1:
题目: 服务器
输入
4
0,2,200,0,1
1,3,400,0,1
2,3,400,1,0
3,3,300,0,1
3,1,3,200,0,1
输出
//2 1 3
第一行输入服务器个数M
接下来M行为服务器参数,按顺序为编号,cpu数,内存大小, 架构, 是否支持NP卡
最后一行为选择要求, 按顺序为服务器数, 选择策略, cpu数,内存大小,架构, NP
(服务器cpu数内存应不小于要求, 架构NP必须一致)
其中架构0-8 为9则都可以
NP 0-1 为2则都可以
选择策略:
为1时 cpu优先, 优先最符合的cpu数,在选最符合的内存大小
为2时 内存优先, 优先最符合的内存大小,在选最符合的cpu数
cpu数内存大小一样时,按编号大小选
输出说明, 选两台, 分别为1,3 
*/ 
#include<bits/stdc++.h>

using namespace std;

//定义一个服务器的结构体来存放服务器的相关参数 
struct Server
{
	int _index;
	int _n_cpu;
	int _n_mem;
	int _arch;
	int _np;
	Server(int index, int n_cpu, int n_mem, int arch, int np):_index(index), _n_cpu(n_cpu), _n_mem(n_mem), _arch(arch), _np(np)
	{
		
	};
};

int main()
{
	int N;
	cin>>N;
	vector<Server> all_sers; //存放所有的服务器参数 
	for(int i=0; i<N; i++)
	{
		string s;
		cin>>s;
		int pos;
		vector<int> temp;
		do
		{
			pos=s.find(',');
			temp.push_back(stoi(s.substr(0, pos)));
			s = s.substr(pos+1);
		}while(pos != -1);  //要记着这种将字符串转换为数组的方法
		Server ser(temp[0], temp[1], temp[2], temp[3], temp[4]); 
		all_sers.push_back(ser); 
	 } 
	//再读取最后一行的总要求 
	string s;
 	cin>>s;
	int pos;
	vector<int> temp;
	do
	{
		pos=s.find(',');
		temp.push_back(stoi(s.substr(0, pos)));
		s = s.substr(pos+1);
	}while(pos != -1);  //要记着这种将字符串转换为数组的方法
	int M = temp[0];
	int stra = temp[1];
	Server ser_need(-1, temp[2], temp[3], temp[4], temp[5]); 
	vector<int> results; //用于存放最后合适的结果 
	if(stra==1) //策略1:cpu优先,按照cpu从小到大排序 
	{
		auto cmp = [](const Server &s1, const Server &s2) {
		if(s1._n_cpu == s2._n_cpu && s1._n_mem == s2._n_mem) return s1._index < s2._index;
		else return s1._n_cpu <s2._n_cpu;
		};
		sort(all_sers.begin(), all_sers.end(), cmp);
		for(int i=0; i<all_sers.size(); i++)
		{
			if(all_sers[i]._n_cpu >= ser_need._n_cpu && all_sers[i]._n_mem >= ser_need._n_mem && (all_sers[i]._arch == ser_need._arch || all_sers[i]._arch == 9) 
			&& (all_sers[i]._np == ser_need._np || all_sers[i]._np == 2))
			{
				results.push_back(all_sers[i]._index); 
			}
			if(results.size() == M) break;
		}
	}
	else if(stra == 2)
	{
		auto cmp = [](const Server &s1, const Server &s2) {
		if(s1._n_cpu == s2._n_cpu && s1._n_mem == s2._n_mem) return s1._index < s2._index;
		return s1._n_mem < s2._n_mem;
		};
		sort(all_sers.begin(), all_sers.end(), cmp);
		for(int i=0; i<all_sers.size(); i++)
		{
			if( all_sers[i]._n_cpu >= ser_need._n_cpu && all_sers[i]._n_mem >= ser_need._n_mem && (all_sers[i]._arch == ser_need._arch || all_sers[i]._arch == 9) 
			&& (all_sers[i]._np == ser_need._np || all_sers[i]._np == 2))
			{
				results.push_back(all_sers[i]._index); 
			}
			if(results.size() == M) break;
		}	
	} 
	cout<<results.size()<<' ';
	for(auto &t:results)
	{
		cout<<t<<" ";
	}
	cout<<endl;
	return 0;
	
}
/*
华为的机试题0728-2:

题目:大侠吃药
输入: 
 6
 2
 5
 2 1
 3 1
 6 1
 4 2
 1 5
输出: 
5
输入
第一行为要吃几幅药
第二行一天最多吃几幅
第三行输入接下来几组依赖关系
2 1表示吃了2才能吃1
3 1吃了3才能吃1
有依赖关系的不能一天吃
输出 最快4天吃完

思路:拓扑排序的方法,不过要注意同一天最多吃的次数。 
*/ 

#include<bits/stdc++.h>

using namespace std;

int main()
{
	int res=0;  //总共要吃的天数
	int n_total;
	cin>>n_total;
	int n_max;
	cin>>n_max;
	int m;
	cin>>m;
	vector<vector<int>> graph(n_total, vector<int>());
	vector<int> indegrees(n_total, 0);
	int a, b;
	for(int i=0; i<m; i++)
	{
		cin>>a>>b;
		graph[a-1].push_back(b-1);
		indegrees[b-1]++;
	}
	queue<int> q;
	for(int i=0; i<indegrees.size(); i++)
	{
		if (indegrees[i] == 0) q.push(i);
	}
	while(!q.empty())
	{
		//同一层,如果要吃的药大于每天能吃的最多的药,要吃多天 
		//这里是和leetcode课程表的题不一样的地方 
		int sz = q.size();
		res += sz/n_max;
		if((sz%n_max) != 0)
		{
			res++; 
		}
		for(int i=0; i<sz; i++)  //处理这一层 
		{
			int cur = q.front();
			q.pop();
			for(auto &v:graph[cur])
			{
				indegrees[v]--;
				if(indegrees[v] == 0)
				{
					q.push(v);
				}
			}
		}
	
	}
	cout<<res<<endl;
	return 0;
}
/*
华为的机试题0728-3:

题目:去西藏
 3 4
 1 0 0 0
 0 0 0 0
 0 0 2 -1

// 2
输入
二维矩阵 其中1表示起点,2表示终点,0可走,-1不可走
求从1开始经过所有0到2的路径数,不走重复节点
输出
有两条
*/ 

#include<bits/stdc++.h>
using namespace std;

int res = 0;
int n_zero=0;

void dfs(vector<vector<int>> &graph, int i, int j, int end_x, int end_y, int de_zero, vector<vector<bool>> visited)
{
	if(i<0 || i>=graph.size() || j<0 || j>=graph[0].size() || graph[i][j] == -1 || visited[i][j])
	{
		return;
	}
	if(i == end_x && j==end_y)
	{
//		cout<<"de_zero="<<de_zero<<endl;
//		cout<<"n_zero="<<n_zero<<endl;
		if( de_zero == n_zero)	
		{
			res++; 
		}
		return;
	}
	visited[i][j] = true;
	de_zero++;
	dfs(graph, i+1, j, end_x, end_y, de_zero, visited);
	dfs(graph, i-1, j, end_x, end_y, de_zero, visited);
	dfs(graph, i, j+1, end_x, end_y, de_zero, visited);
	dfs(graph, i, j-1, end_x, end_y, de_zero, visited);
	visited[i][j] = false;   
	de_zero--;
}

int main()
{
	int m, n;
	cin>>m>>n;
	vector<vector<int>> graph(m, vector<int>());
	int a;
	int start_x, start_y, end_x, end_y;
	for(int i=0; i<m; i++)
	{
		for(int j=0; j<n; j++)
		{
			cin>>a;
			if(a==1)
			{
				start_x = i;
				start_y = j;
//				cout<<"start_x="<<start_x<<";start_y="<<start_y<<endl;
			}
			if(a==2)
			{
				end_x = i;
				end_y = j;
//				cout<<"end_x="<<end_x<<";end_y="<<end_y<<endl;
			}
			else if(a==0)
			{
				n_zero++;
			}
			graph[i].push_back(a);
			cout<<a<<' ';
		}
		cout<<endl;
	}
	vector<vector<bool>> visited(m, vector<bool>(n, false));
	dfs(graph, start_x, start_y, end_x, end_y, -1, visited);
	cout<<res<<endl;
	return 0;
}




#学习路径#
全部评论
美团在职学长送内推福利 内推优势:免简历筛选,直通笔试,全流程跟踪,提供答疑咨询 内推途径 一、移动端https://campus.meituan.com/bole/wechat?staffSsoId=5430873&appKey=hiring-campus-portal投递简历 二、PC端美团官网投递:https://campus.meituan.com/ 内推码:pVDJhsq 注意内推码前后不要有空格 面向人群:2022届海内外院校应届毕业生(在2021年11月-2022年10月期间毕业) 投递时间:即日起至2021年10月14日24:00(北京时间)建议大家早投递,越往后HC越少 岗位:技术类、零售类、产品类、运营类、设计类、市场职能类、销售相关类 base:北京、上海、成都、深圳、厦门、广州、武汉、扬州、石家庄等 欢迎大家加入QQ群:540965327 有任何问题可以在群里交流
点赞 回复
分享
发布于 2021-08-05 14:33

相关推荐

1 30 评论
分享
牛客网
牛客企业服务