米哈游后端笔试第一场(含1,2题代码)

太菜了只做出两题,有没有大佬出了第三题

第一题:求两点间最短曼哈顿距离,可以穿越边界

#include <bits/stdc++.h>

using i64 = long long;

i64 n, m;

i64 getDist(std::pair<i64, i64> a, std::pair<i64, i64> b) {
	return std::min(std::abs(a.first - b.first), n - std::abs(a.first - b.first))
		+ std::min(std::abs(a.second - b.second), m - std::abs(a.second - b.second));
}

int main() {
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);

	std::cin >> n >> m;
	std::vector<std::pair<i64, i64>> v(3);
	for (i64 i = 0; i < 3; i++) {
		std::cin >> v[i].first >> v[i].second;
	}

	std::cout << getDist(v[0], v[1]) + getDist(v[1], v[2]) << "\n";

	return 0;
}

第二题,树形dp瞎搞,dp[u]表示以u为根节点,最大有多少个节点距离根节点1的距离不超过k的数量

#include <bits/stdc++.h>

using i64 = long long;

int main() {
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);

	int n, k;
	std::cin >> n >> k;
	std::vector adj(n, std::vector<int>());
	for (int i = 0; i < n - 1; i++) {
		int u, v;
		std::cin >> u >> v;
		u--, v--;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}

	std::vector<i64> dp(n);
	std::vector<int> d(n); // depth

	auto dfs = [&](auto self, int x, int fa) -> void {
		for (int y : adj[x]) {
			if (y == fa) continue;
			d[y] = d[x] + 1;
			self(self, y, x);
		}
	};

	auto calc = [&](auto self, int x, int fa) -> void {
		if (d[x] > k) {
			return;
		}
		dp[x] = 1;

		bool isLeaf = true;
		for (int y : adj[x]) {
			if (y == fa) continue;
			self(self, y, x);
			isLeaf = false;
			dp[x] += dp[y];
		}

		if (isLeaf) {
			dp[x] = k - d[x] + 1;
		}
	};

	dfs(dfs, 0, -1);
	calc(calc, 0, -1);

	std::cout << dp[0] << "\n";

	return 0;
}

第三题,数学概率题,不会

#米哈游##笔试##我的实习求职记录#
全部评论
概率论的期望咋算我都忘了你不是一个人
1 回复 分享
发布于 2023-08-13 22:59 北京
树形dp是怎么练习的
点赞 回复 分享
发布于 2023-08-13 22:58 安徽
请问t2为什么不能直接层序遍历统计答案,个人理解不需要dp吧?
点赞 回复 分享
发布于 2023-08-13 23:08 上海
佬哥,平时刷题leetcode吗,树形dp用啥网站刷
点赞 回复 分享
发布于 2023-08-14 14:37 陕西
T3不是纯模拟吗……前几年在某个小比赛出过一个几乎一样的签到题。 因为不是模意义下而是精度运算的,所以也不用推公式。直接用now去统计某个分支的概率,然后衍生的两个分支就是now*p和now*(1-p),随便加一加就行。
点赞 回复 分享
发布于 2023-08-14 16:06 广东

相关推荐

3 13 评论
分享
牛客网
牛客企业服务