华为七月份机试题总结2-0714
对题目进行了详细的描述,并提供了输入输出示例,参考代码也更适合基础薄弱的参看。
希望大家可以一起交流学习,offer拿到手软!!!
第三题不理解如何根据吞吐量构建图的边,希望会的大佬可以提供相关思路和代码。
/* 华为的机试题0714-1: 感觉和岛屿的个数是一样的 题目: 第蜂巢形状的区域相连(M*N),输入中只有C(Clean)和P(Pollution)两种数据,要求输入未被污染的区域数量 注意是蜂巢 上下,左右,左下,右上一共6个方向。 * * * # * * * 这样正好是一个六边形 实际上其他方向也可以例如(上下,左右,左下,右上),只要保证是6个方向就可以(发现不行, 蜂巢的方向究竟是怎么确定的,题目上有没有详细的说明???) * * * # * * * 输入: 第一行输入:m, n (m行n列) 依次输入每一行的数据 4 4 C C P P P C P C P P P C C C C P 输出: 2 */ #include<bits/stdc++.h> using namespace std; void dfs(vector<vector<char>> &graph, int i, int j) { if(i<0 || i>=graph.size() || j<0 || j>=graph[0].size() || graph[i][j] == 'P') { return; } graph[i][j] = 'P'; dfs(graph, i+1, j); dfs(graph, i-1, j); dfs(graph, i, j+1); dfs(graph, i, j-1); dfs(graph, i-1, j+1); dfs(graph, i+1, j-1); //换两种方向也一样 (发现不行) // dfs(graph, i-1, j-1); // dfs(graph, i+1, j+1); } int main() { int m, n; cin>>m>>n; // cout<<"m="<<m<<";n="<<n<<endl; vector<vector<char>> graph(m, vector<char>(n)); char temp; for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { cin>>temp; graph[i][j] = temp; // cout<<"temp="<<temp<<endl; } } int res = 0; for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { if(graph[i][j] == 'C') { dfs(graph, i, j); res++; } } } cout<<res<<endl; return 0; }
/* 华为的机试题0714-2:这一题和leetcode上的1526一样 题目: 是给一组长度为N的整数字符串,每个箱子最终的位置,要求是把所有箱子都从0推到最终位置,允 许连续的箱子一起推,比如2,3,4号箱子都需要前进的话,推一次就可以,输出最少的推动次数。 输入: 3 1 2 输出:4 if(nums[i] > nums[i-1]) dp[i] = dp[i-1]+(nums[i]-nums[i-1]) else dp[i] = dp[i-1] dp[0] = nums[0] */ #include<bits/stdc++.h> using namespace std; int main() { int a; vector<int> nums; while(cin>>a) // while(scanf("%d",&a)!=EOF) { nums.push_back(a); } vector<int> dp(nums.size(), 0); dp[0] = nums[0]; for(int i=1; i<nums.size(); i++) { if(nums[i] > nums[i-1]) { dp[i] = dp[i-1] + (nums[i] - nums[i-1]); } else { dp[i] = dp[i-1]; } } cout<<dp[nums.size()-1]<<endl; }
/* 华为的机试题0714-3:本题网上找不到输入输出测试样例,也不理解如何根据吞吐量构建图的边,希望厉害的大佬可以提供思路及相关代码 题目: 网络维护:在一个n个结点的网络中,每个结点i的吞吐量为2^i,由于缺电(可能是湾湾)需要关闭其中的k个结点, 需要保证剩余结点仍能互通,输入就是n和k两个值,空格隔开,输出要求给出关闭的结点顺序,升序排列。n<100000好像是。 输入: 输出: 网上提供的一种做题思路,不过不是很理解 先把顶点n加入res中,然后找到与res中顶点的距离小于等于n-k-len(res)的所有顶点中的最大值顶点x, 把x到res的路径上所有点加入res, 重复上述过程直到len(res)==n-k */ #include<bits/stdc++.h>