9.08 华为笔试
第一题
#include <bits/stdc++.h>
using namespace std;
class Tree
{
public:
Tree(int _val) : val(_val), sum(0), left(nullptr), right(nullptr) {}
int val;
int sum;
Tree* left;
Tree* right;
};
int main()
{
int N;
cin >> N;
int SumVal = 0;
vector<Tree*> trees;
// 记录每个节点的值和整个树的总和
for (int i = 0; i != N; ++i)
{
int temp;
cin >> temp;
Tree* newTree = new Tree(temp);
trees.push_back(newTree);
SumVal += temp;
}
// 记录每个节点的左右子节点
int jiedian, zijiedian;
while (cin >> jiedian >> zijiedian)
{
if (trees[jiedian]->left == nullptr)
{
trees[jiedian]->left = trees[zijiedian];
continue;
}
trees[jiedian]->right = trees[zijiedian];
}
// 从尾到头递归决定每个节点的sum值
for (int i = N - 1; i >= 0; --i)
{
Tree* tr = trees[i];
tr->sum = tr->val;
if (tr->left == nullptr && tr->right == nullptr)
continue;
if (tr->left)
tr->sum += tr->left->sum;
if (tr->right)
tr->sum += tr->right->sum;
}
int cha = INT_MIN;
int biaohao = -1;
// 计算每个节点差
for (int i = 0; i != N; ++i)
{
int temp = abs(SumVal - trees[i]->sum -trees[i]->sum);
if (temp > cha)
{
cha = temp;
biaohao = i;
}
}
cout << biaohao << endl;
return 0;
}第二题
#include <bits/stdc++.h>
using namespace std;
int main()
{
int M, N;
string s;
cin >> s;
M = s[0] - '0';
N = s[2] - '0';
vector<vector<int>> vec(M, vector<int>(N, 0));
vector<vector<int>> dp(M, vector<int>(N, 0));
// 构建vec
for (int row = 0; row != M; ++row)
{
for (int col = 0; col != N; ++col)
{
int temp;
cin >> temp;
vec[row][col] = temp;
}
}
// 构建dp
for (int row = 0; row != M; ++row)
{
for (int col = 0; col != N; ++col)
{
int jump = vec[row][col];
if (jump == 0) continue;
// 向下跳跃的dp
for (int i = row + 1; i != M && i <= row + jump; ++i)
{
if (dp[i][col] > dp[row][col] + 1 || dp[i][col] == 0)
dp[i][col] = dp[row][col] + 1;
}
// 向右跳跃的dp
for (int j = col + 1; j != N && j <= col + jump; ++j)
{
if (dp[row][j] > dp[row][col] + 1 || dp[row][j] == 0)
dp[row][j] = dp[row][col] + 1;
}
}
}
cout << dp[M - 1][N - 1] << endl;
return 0;
}第三题
#include <bits/stdc++.h>
#include <unordered_map>
using namespace std;
int main()
{
string targetMoKuai;
cin >> targetMoKuai;
unordered_map<string, int> modules; // 模块名 时间
unordered_map<string, vector<string>> yilai; // 模块名 依赖模块
string moKuai;
while (cin >> moKuai)
{
int size = moKuai.size();
int left = 0, right = 0;
while (moKuai[right] != ',') ++right;
string newName = moKuai.substr(left, right - left);
++right;
left = right;
while (right < size && moKuai[right] != ',') ++right;
int newTime = stoi(moKuai.substr(left, right - left));
modules[newName] = newTime;
++right;
left = right;
while (left < size)
{
while (right < size && moKuai[right] != ',') ++right;
string newYiLai = moKuai.substr(left, right - left);
yilai[newName].push_back(newYiLai);
++right;
left = right;
}
}
// 检查是否有循环依赖
int totalTime = 0;
return 0;
}
美的集团公司福利 755人发布